问题描述
在android版本大于30时,部署的APP出现明明在manifest清单中罗列了需要的存储权限,也通过requestPermissions动态申请到了权限,到手机设置 - 应用管理 - 权限管理中查看,APP也赋予了相应存储权限,但是就是新建文件、创建文件夹失败。
以下权限已获取到:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
解决方案
描述
可以理解为,android版本大于30时,进一步收紧了存储权限,在获取WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE的同时,还要进行额外权限的请求,姑且这样理解吧。
解决方法
- 在manifest清单中
- 添加MANAGE_EXTERNAL_STORAGE权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 在application节点新增旧的存储模式的申明
android:requestLegacyExternalStorage="true"
- APP初始化时Java处理,申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" +Login.this.getPackageName()));
startActivityForResult(intent, 190009);
}else{
startInit();
}
- 回调处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 190009){
if (Environment.isExternalStorageManager()) {
startInit();
} else {
Toast.makeText(Login.this, "请同意请求的权限,可尝试重新进入APP!", Toast.LENGTH_LONG).show();
}
}
}
新申请的权限会打开一个新的activity进行权限的申请,勾选后表示同意。