车机中行车记录仪(DVR)MVP模式开发总结

现在的车机系统中,DVR已经是不可或缺的功能了。DVR就是行车记录仪的简称,是一个单独的硬件模块。DVR通过can协议跟车机端通信,通过视频线把DVR的视频信号给到车机端的Camera驱动,并展示到车机端应用中。
既然这里涉及到视频流的呈现,我们不难猜出,展示内容需要使用SurfaceView:

	//Camera关联surfaceView
	mCamera.setPreviewDisplay(holder);
	mCamera.startPreview();
	//解除surfaceview的关联,释放Camera资源
	private synchronized void releaseCamera() {
		status = STATUS_CLOSING;
		boolean isavmon = isAvmOn();
		Log.d(TAG, "releaseCamera >>> isAvmOn = " + isavmon);
		if (mCamera != null) {
			mCamera.setPreviewCallback(null);
			mCamera.setErrorCallback(null);
			mCamera.stopPreview();
			mCamera.release();
			mCamera = null;
			Log.i(TAG, "Close Camera success!!!");
			status = STATUS_CLOSED;
			writeDvrOpenCameraState(false);
		}
	}
	

由于车机上使用Camera的地方除了DVR之外,可能还会有全景泊车(AVM)、倒车后视等应用使用,因此,我们需要在打开DVR应用之后,启动一个轮询机制,去不断检测某个地方的标志位,是否有全景泊车打开了。如果发现有全景泊车打开了,那DVR这个时候需要暂时释放掉Camera资源,等全景泊车退出之后,我们再重新使用Camera资源:

private static final int OPT_CAMERA_TIME_DELAY = 500;
....
mHandler.postDelayed(checkCamera, OPT_CAMERA_TIME_DELAY);
....
//轮询检测倒车后视是否打开
	private Runnable checkCamera = new Runnable() {
		@Override
		public void run() {
			if(status == STATUS_OPENED && mCamera != null && isAvmOn()){
				//需要关闭Camera并且修改文件
				realStopPreview();
			}else if(status == STATUS_CLOSED && !isAvmOn()){
				//需要打开Camera并且修改文件
				realStartPreview(mHolder);
			}			
			mHandler.postDelayed(this, OPT_CAMERA_TIME_DELAY);
		}
	};

由于跟DVR通信是一个异步的过程,因此整个应用使用MVP模式很有必要。界面触发点击事件,给到P层,P层再给到底层的can;当DVR有返回结果之后,也是先给到P层,P层处理完逻辑之后,再更新界面效果。部分接口如下:

	// view层接口
	interface View {
		// 是否显示内存卡异常
		void showSdCard(boolean isShow);

		// 是否录制
		void isRecoding(boolean b);

		// 麦克风是否打开
		void isOpenMic(boolean b);

		// 是否当前显示回放列表
		void isShowReplayList(boolean b);

		// 是否紧急录制
		void isEmergencyRecording(boolean b);

		// 是否显示底部控制
		void isShowBottom(boolean isShow);
		
		// 设置回放是否播放状态
		void isShowPlay(boolean isShow);

		// 设置回放是否锁定
		void isLock(boolean isShow);
		
		//退出
		void exit();
		
		//是否紧急回放
		void isMergePlayBack(boolean ismerge);
		
	}
// p层接口
	interface Presenter {

		void onDestroy();

		void onResume();
		
		/**
		 * SurfaceHolder 创建
		 * 
		 * @param arg0
		 */
		void surfaceCreated(SurfaceHolder surfaceholder);

		/**
		 * SurfaceHolder 销毁
		 * 
		 * @param arg0
		 */
		void surfaceDestroyed(SurfaceHolder arg0);

		/**
		 * 是否开始录制
		 */
		void recordingYesOrNo();

		/**
		 * 紧急备份
		 */
		void backups();

		/**
		 * 麦克风打开状态
		 */
		void micIsOpen();

		/**
		 * 正常回放
		 */
		void playback();
		
		/**
		 * 紧急回放
		 */
		void playbackMerge();

		/**
		 * 播放或者暂停
		 */
		void playOrPause();

	}

注意点:

  • DVR应用要严格控制其生命周期,不仅要释放Camera硬件资源,而且还要把自己的状态值写入特定目录的文件中,以便其他使用Camera的应用知道。
  • DVR应用的界面,时刻需要根据DVR的状态显示。特别是录制状态和回放状态的切换。
  • DVR的录制模式分为两种情况,一种是一般的正常录制,回放的时候对应的一般视频回放,一般视频在SD卡存储不够的时候,DVR会自动删除时间最旧的视频;一种是特殊的紧急录制,对应紧急视频回放,可以手动切紧急录制状态,也可能是DVR模块的重力感应器感受到碰撞,也会自动开启紧急录制转态,这些视频,DVR模块是不会自动覆盖的,需要用户自己去手动删除或者格式化SD卡。
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值