公司广告机这一块有一个客户提出一个需求:开机播放视频,用户在操作后,10s内没有操作,则又播放视频。
首先要将客户的视频内置到内置sd卡,因为直接编译到system目录,是无法去播放的。这个还比较好弄,收到开机广播后,启动一个service,在service内开启一个AsyncTask线程执行拷贝,拷贝ok后则向数据库或sp或prop中存入一个值,则下次开机就不会拷贝了。
在这个位置,遇到了一些问题,以前5.1之前,像sd卡内写入东西时不需要动态提示用户申请权限。而现在6.0开始需要动态提示,调试时一直打印的自己的TAG分析log,怎么都没找出原因,后来发现是没有申请权限。知道原因后就好办了。直接去DefaultPermissionGrantPolicy.java
给这个app所有权限即可。
+ PackageParser.Package startPackage = getSystemPackageLPr("你的app包名");
+ if (startPackage != null) {
+ grantRuntimePermissionsLPw(startPackage, CONTACTS_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(startPackage, PHONE_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(startPackage, LOCATION_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(startPackage, SMS_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(startPackage, CAMERA_PERMISSIONS, true, userId);
+ grantRuntimePermissionsLPw(startPackage, STORAGE_PERMISSIONS, true, userId);
+ }
之后拷贝完成后则启动一个intent播放视频即可
Uri parse = Uri.parse("file:///mnt/sdcard/video_demo.mp4");
Intent play_intent = new Intent(Intent.ACTION_VIEW);
play_intent.setDataAndType(parse,"video/mp4");
play_intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
startActivity(play_intent);
这个问题个人觉得难点在于怎么知道用户没有操作android系统。在网上查了相关资料,都是在app内部实现的,大抵就是根据触摸的按下与抬起来控制计时器。这样的话,app内部确实能够做到,但是对于整个android系统来说,即使去Activity.java中复写触摸事件,也无法达到此要求。
于是换了一个思路,能否直接从tp这一块着手呢,问过相关同事,这个tp是usb的,他们没有弄过,如果是i2c控制的那就很容易弄了。这个方法也只能暂时先告一段落。
遂再次查资料,发现可以借鉴android休眠这一块来弄,当天测试了下没有成果。周末查询资料后,今天通过打印log,终于找到了PowerManagerService.java 中的mLastUserActivityTime变量即为最后一次用户活动时间,这就好办了,直接在updateUserActivitySummaryLocked方法中实现即可。真是山穷水复疑无路啊。
if(now-mLastUserActivityTime>8000 && mBootCompleted && mSystemReady){
Message mymsg = mHandler.obtainMessage(MSG_USER_NOT_ACTIVITY);
mymsg.setAsynchronous(true);
mHandler.sendMessage(mymsg);
}
now为开机启动到现在的时间,休眠时不会计入,因为我的是永不休眠,则不影响。因此只需要计算开机启动后到现在的时间与最后一次用户活动的时间之差即可满足一段时间内用户无操作的需求。而用户每一次操作系统,mLastUserActivityTime都会更新,因此只需这个条件即可,在调试时发现了重启现象,原因时系统还未开机完成不能后发送广播。我这里的MSG_USER_NOT_ACTIVITY实际就是发送广播,通知系统可以播放视频了。
所以还需加入开机完成的flag位。
到此为止,知道了用户无操作的的情况,去播放视频就是很简单了。也就不在追溯了。