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


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

     

           在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);

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

     

     

     

  • 相关阅读:
    BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
    【BZOJ 1022】 [SHOI2008]小约翰的游戏John
    【BZOJ 1295】 [SCOI2009]最长距离
    【BZOJ 1103】 [POI2007]大都市meg
    【BZOJ 3172】 [Tjoi2013]单词
    【BZOJ 1067】 [SCOI2007]降雨量
    【BZOJ 1491】 [NOI2007]社交网络
    【BZOJ 1087】[SCOI2005]互不侵犯King
    【BZOJ 1009】 [HNOI2008]GT考试
    【BZOJ 1053】[HAOI2007]反素数ant
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6947230.html
Copyright © 2020-2023  润新知