Android版本大于R(30)时获取外部存储权限的方法

问题描述

在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的同时,还要进行额外权限的请求,姑且这样理解吧。

解决方法

  1. 在manifest清单中
  • 添加MANAGE_EXTERNAL_STORAGE权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • 在application节点新增旧的存储模式的申明
android:requestLegacyExternalStorage="true"
  1. 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();
}
  1. 回调处理
 @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进行权限的申请,勾选后表示同意。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值