最近在做电视盒子,系统是6.0的,我负责的模块是更新模块。用的是增量更新,关于增量更新不多说,就是用阿里的工具。我负责的就是将下载的文件放到指定的目录(/cache/update.zip)下,这都是超级简单的。但更新的模块里有一个小功能就是U盘更新:就是遍历U盘的一级目录,找到指定的增量包(压缩文件),复制移动到指定目录下(/cache/update.zip)。这边的代码也超级简单,百度一大把。
4.4盒子(公司的旧盒子)一点问题没有,但6.0(公司的新盒子)就有问题,主要是读不了U盘的文件,file.listfile()==null,也就是遍历U盘的目录为空,期初以为是权限没动态获取,毕竟6.0,有些危险权限还是要尊重的。但核心论点来了。
1.我是不是可以认为,当盒子刷到系统里的时候,只要我在清单文件配置了权限,都不需要对这些权限做动态获取。
//从目前的调试结果看,我认为这一点应该是真命题。
2.是不是我动态获取了读写权限,我就可以在任意位置读写。
//我写过一个demo,运行在6.0的小米手机上,我就无法将文件写到/mnt下,但可以写到/mnt/sdcard下
这几天我遇到的问题是,当我这个app刷到系统的时候,监听到了U盘的热插拔,获得了U盘的路径,但遍历U盘的时候,listfile就是null,且就算我读取U盘的特定文件也会出错(权限有关的问题)。因为是刷到系统的,且我的清单文件也有读写权限,并且我事先在没刷盒子之前动态获取权限调试过是通过的,但一刷到系统(去除动态获取)就是有问题。所以我就认为是系统有问题,但系统那边又说他自己写过demo,在系统setting下编写从U盘copy文件到指定目录是没问题。
僵持不下,我就用了两种方案调试,
1.添加动态获取权限(读写)的代码,然后让系统打包刷机,测试是成功的但需要动态获取
2.将系统setting的权限都考到我的app清单文件下(我怀疑是少了某个权限),果不其然,测试成功。
总结:当app刷到系统目录下,是不需要动态获取权限的,但如果只有读写权限,是无法读到U盘上的文件的,至于需要的事哪个,我还没有找出,只能一锅端的全拿来。
<!-- 系统升级权限 -->
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.RECOVERY" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- //系统设置的所有权限-->
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.HARDWARE_TEST" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MASTER_CLEAR" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIMAX_STATE" />
<uses-permission android:name="android.permission.C