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

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

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

 

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

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

 

 

 

目录
相关文章
|
Oracle Ubuntu Java
Ubuntu安装JDK
一. Ubuntu 安装JDK的两种方式 1. 通过apt安装. 2. 通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 二. 通过apt安装(jdk有很多版本, 这里介绍两种: openjdk和oracle的JDK) 1.
71284 4
|
Java Android开发
Android10.0(Q) 网络自动校时bug修改
Android10.0(Q) 网络自动校时bug修改
270 0
|
存储 缓存 Ubuntu
带你读《Elastic Stack 实战手册》之8:—— 3.4.1.1.安装Elasticsearch(本地及docker)(1)
带你读《Elastic Stack 实战手册》之8:—— 3.4.1.1.安装Elasticsearch(本地及docker)(1)
349 0
|
jenkins Java 持续交付
Jenkins----节点管理之添加节点
Jenkins----节点管理之添加节点
1868 0
Jenkins----节点管理之添加节点
|
存储 传感器 SQL
基于阿里云物联网平台,用20元体验物联网开发( 自制 Arduino 环境监测仪)
用很简单的产品esp8266+dht11 接入IoT平台,实现搭建。
9015 15
|
10天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
8天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
389 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话