前言:近期收到市场监管部门的要求,要求app在未获取任何权限的情况下任能正常运行,而我们的app内存卡权限之前一直是必要的权限,于是需要进行修改,主要涉及到的方面就是图片缓存,app更新,保存图片,读取相册,下载视频,数据库,还有一些用户的信息保存。
我这边分为两类,一类是必须要用到读取权限的采用动态获取,不同意就无法正常使用:保存图片,读取相册,下载视频,数据库。
还有一类是非必须用到读取权限的则判断权限是否开启,开启则获取,没开启则用其他方式实现:图片缓存,app更新,用户的信息保存。
第一类我在这边就不多说明了,用到的时候获取权限,第二类我这边说一下:
关于app更新:
在应用进入的闪屏页初始化中,首先判断是否拥有SD卡,是否获取了读写SD卡权限:
if (!SdCardUtils.isSdCardExist(AppStart.this)) {
// 设置应用中保存的根路径
AppConstants.PARENT_FOLD_PATH = getFilesDir().getAbsolutePath();
}else {
// 设置应用中保存的根路径
AppConstants.PARENT_FOLD_PATH = Environment
.getExternalStorageDirectory() + File.separator + Constants.APP_NAME
+ File.separator;
}
/**
* 判断当前设备上SD卡外部存储是否可用,这里只考虑6.0以上版本
*/
public static boolean isSdCardExist(Context context){
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
boolean isExist = false;
isExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
return isExist;
}
如果我们关闭了SD卡读写权限,下载的更新包就会下载到内部存储空间
/**
* 构造更新的软件的安装包的保存路径名
*/
public static final String buildUpdateAPKPath() {
if (!SdCardUtils.isSdCardExist(AppContext.getInstance()) && fileDir != null && fileDir.exists()) {
return fileDir.toString() + "/";
}
String filePath = FileUtils.buildFilePath(new String[] { SdCardUtils.getSdCardPath(), APP_NAME });
File dir = new File(filePath);
if (!dir.exists()) {
dir.mkdirs();
}
return filePath;
}
应用下载完毕,我们查看一下应用目录,发现更新包已经被下载下来了。
图片缓存:
内存卡读取权限没开的情况下,就采用网络缓存图片的方式
其中权限判断的条件这边每个app都不一样,仅供参考
用户的信息保存
用户信息的保存比较简单,换成sp的保存方式就好了
额外再补充一个地方:
图中是华为应用市场直接下载下来的京东,淘宝,还有一淘,大家会发现和传统的系统权限弹窗不一样,一开始我也弄了很久,最后开窍了,也去市场下载了我们的app,发现第一次启动也是这样的多权限同时提示的弹框,但是大家要注意的是,从应用市场下载下来第一次启动才会以这样的样式出现,假如拒绝相应权限重启后,则恢复传统的系统权限弹窗,且非应用市场安装即自己安装的app也是传统的系统权限弹窗。
最后还要加一点补充,上面说的apk更新,理论上是没问题,但现实很骨感,部分机型反而有问题,只能仁者见仁智者见智,下面是我项目中的选择方案,另外我也测试了淘宝在没有存储权限的情况下,也是在sd卡里进行下载和安装apk