desc:摄像头断开自动重连

main
xiaowusky 2 years ago
parent a122b24fcf
commit 7b57ec38e8

@ -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<BaseResponse>() {
override fun onResult(result: BaseResponse) {
commonDialog.dismiss()
commonDialog?.dismiss()
}
override fun onError(error: String?) {
commonDialog.dismiss()
commonDialog?.dismiss()
}
})
}
fun testExportExcel(context: Context, datas: MutableList<Gas>, commonDialog: CommonDialog) {
fun testExportExcel(context: Context, datas: MutableList<Gas>, commonDialog: CommonDialog?) {
val allData = mutableListOf<List<SimpleCellValue>>()
datas.forEach {
val row = mutableListOf<SimpleCellValue>()
@ -109,6 +109,6 @@ object TestUtils {
}
ExcelUtils.writeStringListToExcel(allData, context);
commonDialog.dialogBinding?.root?.postDelayed({ commonDialog.dismiss() }, 1000)
commonDialog?.dialogBinding?.root?.postDelayed({ commonDialog.dismiss() }, 1000)
}
}

@ -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)

@ -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)
}
}

@ -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()
}

@ -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)
}
}

@ -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() {

@ -3,14 +3,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.opengl.GLSurfaceView
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
<SurfaceView
android:id="@+id/surface2"
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent" />

@ -7,6 +7,7 @@
android:orientation="vertical">
<ImageView
android:id="@+id/img"
android:layout_width="@dimen/_132dp"
android:layout_height="@dimen/_132dp"
android:src="@mipmap/ic_sync" />

@ -55,4 +55,6 @@
<string name="no_upan_tip">请先插入U盘!</string>
<string name="sync_data_tip">数据同步中</string>
<string name="export_data_tip">数据导出中</string>
<string name="connecting_camera">正在连接摄像头...</string>
</resources>

@ -0,0 +1,5 @@
package com.yinuo.library.vlc
interface IFrameCallBack {
fun onFrame()
}

@ -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;
}
}

Loading…
Cancel
Save