From 7b57ec38e81939245a443144761a028d1130c3f3 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Mon, 19 Jun 2023 15:28:59 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E6=91=84=E5=83=8F=E5=A4=B4=E6=96=AD?= =?UTF-8?q?=E5=BC=80=E8=87=AA=E5=8A=A8=E9=87=8D=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yinuo/safetywatcher/TestUtils.kt | 10 ++--- .../watcher/base/BaseActivity.kt | 14 +++++++ .../safetywatcher/watcher/ui/CloudActivity.kt | 16 ++------ .../safetywatcher/watcher/ui/HomeActivity.kt | 38 +++++++++++++++---- .../watcher/ui/QueryDataActivity.kt | 10 ++--- .../watcher/ui/view/CommonDialog.kt | 7 ++++ app/src/main/res/layout/activity_home.xml | 8 +--- .../main/res/layout/layout_sync_dialog.xml | 1 + app/src/main/res/values/strings.xml | 2 + .../com/yinuo/library/vlc/IFrameCallBack.kt | 5 +++ .../yinuo/library/vlc/RtspSurfaceRender2.java | 20 ++++++++-- 11 files changed, 92 insertions(+), 39 deletions(-) create mode 100644 library-vlc/src/main/java/com/yinuo/library/vlc/IFrameCallBack.kt diff --git a/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt b/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt index 89f83a0..9fd0149 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/TestUtils.kt @@ -83,21 +83,21 @@ object TestUtils { context.startActivity(intent) } - fun testUploadFile(uploadApi: UploadFileApi, path: String, commonDialog: CommonDialog) { + fun testUploadFile(uploadApi: UploadFileApi, path: String, commonDialog: CommonDialog?) { val path = PathUtils.getExternalStorageDirectory() + "/test2.mp4" uploadApi.singleUpload(path, System.currentTimeMillis(), object : RequestResultCallBack() { override fun onResult(result: BaseResponse) { - commonDialog.dismiss() + commonDialog?.dismiss() } override fun onError(error: String?) { - commonDialog.dismiss() + commonDialog?.dismiss() } }) } - fun testExportExcel(context: Context, datas: MutableList, commonDialog: CommonDialog) { + fun testExportExcel(context: Context, datas: MutableList, commonDialog: CommonDialog?) { val allData = mutableListOf>() datas.forEach { val row = mutableListOf() @@ -109,6 +109,6 @@ object TestUtils { } ExcelUtils.writeStringListToExcel(allData, context); - commonDialog.dialogBinding?.root?.postDelayed({ commonDialog.dismiss() }, 1000) + commonDialog?.dialogBinding?.root?.postDelayed({ commonDialog.dismiss() }, 1000) } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt index c70cf74..354ee87 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt @@ -5,7 +5,9 @@ import android.view.View import android.view.ViewGroup import android.widget.RelativeLayout import androidx.appcompat.app.AppCompatActivity +import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.ActivityBaseBinding +import com.yinuo.safetywatcher.watcher.ui.view.CommonDialog import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar abstract class BaseActivity : AppCompatActivity() { @@ -14,6 +16,8 @@ abstract class BaseActivity : AppCompatActivity() { ActivityBaseBinding.inflate(layoutInflater) } + var loadingDialog: CommonDialog? = null; + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(baseBinding.root) @@ -52,6 +56,16 @@ abstract class BaseActivity : AppCompatActivity() { } } + fun showLoadingDialog(resId: Int = R.string.sync_data_tip) { + loadingDialog?.dismiss() + loadingDialog = CommonDialog(resId) + loadingDialog!!.show(supportFragmentManager, "loading") + } + + fun closeLoadingDialog() { + loadingDialog?.dismiss() + } + open val isHome: Boolean = false abstract fun onOptionClick(type: Int, target: View) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt index cd5f3c1..cfe2213 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt @@ -21,10 +21,6 @@ class CloudActivity : NoOptionsActivity() { UploadFileApi() } - private val syncDialog by lazy { - CommonDialog() - } - override fun getTopBarTitle(): String? { return getString(R.string.cloud) } @@ -36,24 +32,20 @@ class CloudActivity : NoOptionsActivity() { override fun initView() { mBinding.apply { syncSensor.setOnClickListener { - showDialog() + showLoadingDialog() uploadSensorData() } syncVedio.setOnClickListener { - showDialog() + showLoadingDialog() uploadVideo() } syncOnce.setOnClickListener { - showDialog() + showLoadingDialog() uploadOnece() } } } - private fun showDialog() { - syncDialog.showNow(supportFragmentManager, "sync") - } - private fun uploadOnece() { uploadSensorData() uploadVideo() @@ -89,6 +81,6 @@ class CloudActivity : NoOptionsActivity() { } private fun uploadFile(path: String) { - TestUtils.testUploadFile(uploadApi, path, syncDialog) + TestUtils.testUploadFile(uploadApi, path, loadingDialog) } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt index 7dd9640..2f026b6 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt @@ -4,7 +4,11 @@ import android.content.Intent import android.os.Build import android.view.View import androidx.annotation.RequiresApi +import com.common.commonlib.utils.NetworkHelper +import com.yinuo.library.vlc.IFrameCallBack import com.yinuo.library.vlc.RtspSurfaceRender2 +import com.yinuo.library.vlc.utils.LogUtils +import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.ActivityHomeBinding import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity import com.yinuo.safetywatcher.watcher.constant.CAMERA_URL @@ -61,14 +65,33 @@ class HomeActivity : NoOptionsActivity() { } private fun setForCamera() { -// mBinding.surface.setEGLContextClientVersion(3); -// val mRender = RtspSurfaceRender(mBinding.surface) -// mRender.setRtspUrl(CAMERA_URL) -// mBinding.surface.setRenderer(mRender) -// mBinding.surface.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY - - mRender = RtspSurfaceRender2(mBinding.surface2) + mRender = RtspSurfaceRender2(mBinding.surface) mRender?.setRtspUrl(CAMERA_URL) + mRender?.setFrameCallBack(object : IFrameCallBack { + override fun onFrame() { + closeLoadingDialog() + watchCamera(5) + } + }) + // 第一次很慢,所以30秒 + watchCamera(30) + showLoadingDialog(R.string.connecting_camera) + } + + private val reStartCamera: Runnable = Runnable { + if (NetworkHelper.isNetworkConnect(this@HomeActivity)) { + LogUtils.w("reStartCamera Runnable start") + showLoadingDialog(R.string.connecting_camera) + mRender?.reStart() + watchCamera(30) + }else{ + watchCamera(5) + } + } + + private fun watchCamera(time: Int) { + mBinding.root.removeCallbacks(reStartCamera) + mBinding.root.postDelayed(reStartCamera, (time * 1000).toLong()) } private fun initTopbarHelper() { @@ -82,6 +105,7 @@ class HomeActivity : NoOptionsActivity() { BatteryHelper.release(this@HomeActivity) WifiHelper.release(this@HomeActivity) SimHelper.release(this@HomeActivity) + mBinding?.root?.removeCallbacks(reStartCamera) mRender?.onDestoryed() } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt index 54af63b..60dcfe2 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/QueryDataActivity.kt @@ -26,9 +26,9 @@ class QueryDataActivity : BaseActivity() { ActivityQueryDataBinding.inflate(layoutInflater) } - private val exportDialog by lazy { - CommonDialog(R.string.export_data_tip) - } +// private val exportDialog by lazy { +// CommonDialog(R.string.export_data_tip) +// } override fun onOptionClick(type: Int, target: View) { if (0 == type) { @@ -197,7 +197,7 @@ class QueryDataActivity : BaseActivity() { } private fun doExportData() { - exportDialog.showNow(supportFragmentManager, "export") - TestUtils.testExportExcel(this, mAdapter._data, exportDialog) + showLoadingDialog(R.string.export_data_tip) + TestUtils.testExportExcel(this, mAdapter._data, loadingDialog) } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonDialog.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonDialog.kt index 436ce37..1902848 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonDialog.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonDialog.kt @@ -7,6 +7,8 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.RotateAnimation import androidx.fragment.app.DialogFragment import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.LayoutSyncDialogBinding @@ -14,6 +16,7 @@ import com.yinuo.safetywatcher.databinding.LayoutSyncDialogBinding class CommonDialog(private val tipResID:Int = R.string.sync_data_tip) : DialogFragment() { var dialogBinding: LayoutSyncDialogBinding? = null + val animation = RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f) override fun onCreateView( inflater: LayoutInflater, @@ -29,6 +32,10 @@ class CommonDialog(private val tipResID:Int = R.string.sync_data_tip) : DialogFr override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) initWindow() + animation.repeatMode = Animation.RESTART + animation.duration = 3000 + animation.repeatCount = -1 + dialogBinding?.img?.startAnimation(animation) } private fun initWindow() { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index afbba43..1d58fa7 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -3,14 +3,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - diff --git a/app/src/main/res/layout/layout_sync_dialog.xml b/app/src/main/res/layout/layout_sync_dialog.xml index 9310871..041b3c6 100644 --- a/app/src/main/res/layout/layout_sync_dialog.xml +++ b/app/src/main/res/layout/layout_sync_dialog.xml @@ -7,6 +7,7 @@ android:orientation="vertical"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b381cb..25a3ba6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,4 +55,6 @@ 请先插入U盘! 数据同步中 数据导出中 + + 正在连接摄像头... diff --git a/library-vlc/src/main/java/com/yinuo/library/vlc/IFrameCallBack.kt b/library-vlc/src/main/java/com/yinuo/library/vlc/IFrameCallBack.kt new file mode 100644 index 0000000..e3f43de --- /dev/null +++ b/library-vlc/src/main/java/com/yinuo/library/vlc/IFrameCallBack.kt @@ -0,0 +1,5 @@ +package com.yinuo.library.vlc + +interface IFrameCallBack { + fun onFrame() +} \ No newline at end of file diff --git a/library-vlc/src/main/java/com/yinuo/library/vlc/RtspSurfaceRender2.java b/library-vlc/src/main/java/com/yinuo/library/vlc/RtspSurfaceRender2.java index 85f7985..efe0865 100644 --- a/library-vlc/src/main/java/com/yinuo/library/vlc/RtspSurfaceRender2.java +++ b/library-vlc/src/main/java/com/yinuo/library/vlc/RtspSurfaceRender2.java @@ -29,7 +29,10 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { private final Object mBitmapLock = new Object(); private Bitmap mVideoBitmap = null; private volatile boolean mIsResumed = false; - private volatile boolean mRecording = false; + + private IFrameCallBack mFrameCallBack = null; + + private int mWidth, mheight; // mSurfaceView 渲染线程 Thread renderThread = new Thread(new Runnable() { @@ -67,6 +70,8 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { LogUtils.v(String.format("onSurfaceChanged: width = %d, height = %d", width, height)); + mWidth = width; + mheight = height; if (mVideoEncoder == null) { LogUtils.v("init"); mVideoEncoder = new MovieEncoder1(mSurfaceView.getContext(), width, height); @@ -82,6 +87,10 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { }); } + public void reStart(){ + RtspHelper.getInstance().createPlayer(mRtspUrl, mWidth, mheight, RtspSurfaceRender2.this); + } + public void setRtspUrl(String url) { mRtspUrl = url; } @@ -90,7 +99,6 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { mSurfaceView.post(() -> { if (!mVideoEncoder.isRecording()) { mVideoEncoder.startRecording(new BaseMovieEncoder.EncoderConfig(EGL14.eglGetCurrentContext())); - mRecording = true; } }); } @@ -99,7 +107,6 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { mSurfaceView.post(() -> { if (mVideoEncoder.isRecording()) { mVideoEncoder.stopRecording(); - mRecording = false; } }); } @@ -111,6 +118,9 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { @Override public void onPreviewFrame(final ByteBuffer buffer, int width, int height) { + if (mFrameCallBack != null){ + mFrameCallBack.onFrame(); + } synchronized (mBitmapLock) { Bitmap overLayBitmap = TxtOverlay.INSTANCE.getOverlayBitmap(); mVideoBitmap.copyPixelsFromBuffer(buffer.position(0)); @@ -130,4 +140,8 @@ public class RtspSurfaceRender2 implements RtspHelper.RtspCallback { public void onPause() { this.mIsResumed = false; } + + public void setFrameCallBack(IFrameCallBack mFrameCallBack) { + this.mFrameCallBack = mFrameCallBack; + } }