因为Android系统版本的不同踩了不少坑,在此记录。
1.Android 8.0以后无法下载到SDK中
问题原因: 文件的存储权限原因导致的
- 动态申请sdk存储权限:Android 6.0以后都是需要动态申请权限的,注意即使动态申请了权限也要在AndroidManifest.xml申请一下,因为需要兼容低版本,低版本中没有动态申请权限一说。
- Android 7.0以后又对存储权限加了限制,应用私有目录被限制访问:
- 私有文件的文件权限不应再由所有者放宽,使用MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE将抛出异常
- 向应用外传递file://URI会出发FileUriExposedException
解决方法:
问题一:判断版本,动态申请权限
//----------------------------------------动态申请权限-------------------------------
private void sdkPermission() {
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.M) {//高于6.0版本,动态申请权限
if (ContextCompat.checkSelfPermission(context, "android.permission.WRITE_EXTERNAL_STORAGE") != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 111);
} else {
downloadApk();
}
}
else {
downloadApk();//低于6.0版本,直接下载apk
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 111:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限已经都通过了,可以下载apk到SDk中了
downloadApk();
} else {
// 没有申请权限
showPermissionDialog();
}
break;
default:
}
}
问题二:7.0以后使用FileProvider访问sdk私有文件
FileProvider:
当targetSdkVersion>=24时,会存在上述问题,可能涉及到的场景有:拍照,程序安装等。
同时,官方在v4包(api=22开始)中引入FileProvider类用于程序间私有文件的共享。该类继承自ContentProvider,使用时需 要在清单文件中注册。
-
第一步 注册:在清单文件中通过标签注册,参考代码对属性进行说