录像过程中系统时间改变了,怎么避免带来的悲剧

录像过程中系统时间改变了,怎么避免带来的悲剧

 

       在android系统上,我们知道改变系统时间的方法有两种,一种就是通过再设置应用里面设置日期时间,另外一种就是通过网络后台同步时间,在手机平板上这两种是比较多的,当然作为车载设备,一般还会增加用GPS时间来同步系统时间。系统时间改变有这么几种方式,但是在录像过程中系统时间改变了,会有什么危害呢?

       通过笔者的实验,如果开始录像是2014年5月20日10点整开始,过了一分钟,加入通过网络已经同步修改了系统时间到2014年7月1日,那么即使这个录像文件实际上只录了5分钟,我们回放这个文件的时候显示的录像文件总时间会有比较大的异常。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

       因为在录像文件编码的时候,大多在结束的时候还是会写入一个结束的时间点,这个时间点采用的是系统时间,而不是开始录像的系统时间加上录像持续的时长。这样可想而知会出问题。那怎么避免呢?

      笔者在实际工作中是在行车记录仪上使用的,系统时间改变都是通过SystemClock.setCurrentTimeMillis(millis);修改下去的,所以我们可以在调用这个接口的前后去做一点手脚。当然,直接放到SystemClock.java里面是不行的,因为它只是一个lib的通用接口,没有对象在里面。

      通过设置应用去修改时间,最终会走到AlarmManagerService.java里的public voidsetTime(long millis)接口里。笔者就在调用前后写了数据库一个存储数据,在行车记录里面监听这个数据的修改,这样就可以在修改时间前,把录像停下来,接到系统时间修改完成后,再启动新的录像。

     public void setTime(longmillis) {
       mContext.enforceCallingOrSelfPermission(
               "android.permission.SET_TIME",
               "setTime");
            Settings.System.putInt(mContext.getContentResolver(),Settings.System.SET_SYTEM_TIME_STATUS, 0);               

        try
        {
          Thread.currentThread().sleep(100);//100ms
        }
           catch(Exceptione){}

       SystemClock.setCurrentTimeMillis(millis);

            Settings.System.putInt(mContext.getContentResolver(),Settings.System.SET_SYTEM_TIME_STATUS, 1);
    }

      还有NetworkTimeUpdateService.java里面修改系统时间的地方也类似处理一下。  

在录像应用里监听这个数据库值的状态,然后在这个content observer里面去会收到值改变的通知,收到这个通知就可以去停止当前的录像,再等这个数据库中的值改变,也就是系统时间设置完成后会设置的这个值,在监听接口里面再去重新启动录像。

     private final classSettingsObserver extends ContentObserver {
        publicSettingsObserver(Handler handler) {
            super(handler);
        }

        @Override
        public voidonChange(boolean selfChange, Uri uri) {
           // synchronized(mLock) {
          //      handleSettingsChangedLocked();
         audio_out_channel_src = Settings.System.getInt(resolver,
                     Settings.System.SET_SYTEM_TIME_STATUS, 5);   

                       Log.d("DeshengDIY","SettingsObserveronChange audio_out_channel_src "+audio_out_channel_src);

                      //在这里去做停止当前录像,然后等系统时间设置完成后,再启动录像

            }
        }

  resolver =getContentResolver();
    mSettingsObserver = newSettingsObserver(mHandler);

   resolver.registerContentObserver(Settings.System.getUriFor(
                   Settings.System.SET_SYTEM_TIME_STATUS),
                    false,mSettingsObserver);

     事实证明,这样的处理是简单有效的。
 

 

 

时间: 2024-09-20 11:33:31

录像过程中系统时间改变了,怎么避免带来的悲剧的相关文章

在C#中改变系统时间 && 得到系统时间改变通知

一.改变系统时间C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 API SetLocalTime来改变系统时间,看来C#中也只能如此了.SetLocalTime需要一个SYSTEMTIME结构指针作为参数,这倒不难,我们可以"比葫芦画瓢"很快在C#中定义这个结构,但问题是,我同时还想"享受".NET Framewo

win7-海尔一体机Win8系统换Win7时,忘了换硬盘格式,导致在装的过程中系统崩溃了 如图:

问题描述 海尔一体机Win8系统换Win7时,忘了换硬盘格式,导致在装的过程中系统崩溃了 如图: 应该怎么办 不要跟我说去维修 解决方案 用win7 pe启动盘启动(微软下载的那种原版的,搜索windows aik),执行fixboot或者bcdedit /rebuild 解决方案二: pe下chkdisk命令将gpt格式转为mbr格式 解决方案三: 在bios里改为bios引导,同过diskpart命令将磁盘转为mbr格式

C#中系统时间和UNIX时间戳互相转换_C#教程

在项目开发过程中,有时会遇到不同程序之间相互调用数据,数据中不免会包含时间,比如ASP.NET调用PHP,牵扯到时间就要做一下处理,PHP程序中一般存取的都是UNIX时间,不像ASP.NET存储的是年月日时分秒,这样就需要做一下转换,代码如下: 一.将系统时间转换成UNIX时间戳 复制代码 代码如下: DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); DateTime dtNow =

C# 写Excel的过程中系统无故停止

问题描述 C#写Excel的过程中有时无故停止,但是Debug不出错,也没在某一行停止,那位大神能指教一下代码如下:try{worksheet=(Excel.Worksheet)wbook.Worksheets[strName];for(inti=0;i<dtPara.Rows.Count;i++){worksheet.Cells[i+5,2].Value=dtPara.Rows[i]["B"].ToString();worksheet.Cells[i+5,3].Value=dt

Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像_Android

Android 2.3.7.r1 按menu键时会停止录像.改成录像时按menu键不做处理,可做如下修改: 在packages/apps/CameraOpen/src/com/mediatek/camera/VideoCamera.java onKeyDown()方法中: 修改 复制代码 代码如下: case KeyEvent.KEYCODE_MENU: if (mHeadUpDisplay != null && mGLRootView != null && !mAlert

Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像

Android 2.3.7.r1 按menu键时会停止录像.改成录像时按menu键不做处理,可做如下修改: 在packages/apps/CameraOpen/src/com/mediatek/camera/VideoCamera.java onKeyDown()方法中: 修改 复制代码 代码如下: case KeyEvent.KEYCODE_MENU: if (mHeadUpDisplay != null && mGLRootView != null && !mAlert

浅谈SAP实施过程中关键用户的作用

在SAP实施过程中,SAP有一个加速方法论(http://www.aliyun.com/zixun/aggregation/16337.html">AcceleratedSAP,ASAP).ASAP是SAP公司为使R/3项目的实施更简单.更有效的一套完整的快速实施方法.ASAP优化了在实施过程中对时间.质量和资源的有效使用等方面的控制.它是一个包括了使得项目实施得以成功所有基本要素的完整的实施方法,主要包括:ASAP路线图.SAP工具包.SAP技术支持和服务.SAP培训和SAP参考模型.A

js中获取时间new Date()的全面介绍_javascript技巧

var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) 何问起 hovertree.com myDate.getTime(); /

百度卫士系统清理过程中,误删文件怎么办?

  在今天的百度卫士使用教程中,我们将来学习的与系统清理这一功能相关的问题与解答.比如说:系统清理过程中,误删文件怎么办?注册表清理之后发现系统异常,如何处理?等等问题.那么,对百度卫士系统清理这一功能感兴趣的网友就一起来看看今天的百度卫士使用教程吧! 百度卫士 问:什么是智能清理功能?如何开启? 智能清理功能会智能判断您的系统资源的使用状态,在空闲时帮您清理电脑垃圾,清理完成后会告诉您结果. 开启自动清理功能后,您的电脑不会再持续累积垃圾,时刻保持畅快运行. 智能清理功能的开启方法: 方法一,