Android 12中申请MANAGE_EXTERNAL_STORAGE权限的问题排查
问题
注:此应用仅为个人使用,不会上架Google Play商店。我正在开发一款需访问主目录的应用,以便存放文件后续通过USB连接读取。已在Manifest.xml中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
但仍不清楚如何引导用户授予权限以访问主目录。在MainActivity.java中添加以下代码时出现意外标记及多个语法问题:
ActivityCompat.requestPermissions(.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.MANAGE_EXTERNAL_STORAGE},1); if (Environment.isExternalStorageManager()){ }else{ Intent intent = new Intent(); intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", this.getPackageName(), null); intent.setData(uri); startActivity(intent); }
请问我具体哪里出错了?这段代码应该放在Fragment的onClickListener中还是其他文件里?
解决方法
一、代码中的错误点
- 语法错误:
ActivityCompat.requestPermissions(.this, ...)里的.this是错误写法,在Activity中直接用this即可,Fragment中则替换为getActivity()。 - 权限申请逻辑错误:
MANAGE_EXTERNAL_STORAGE是Android 11+的特殊权限,不能通过requestPermissions()弹窗申请,只能跳转系统设置让用户手动开启,你代码里的else分支逻辑是对的,但前面将该权限混入普通权限申请是无效操作。 - Manifest标签不完整:
MANAGE_EXTERNAL_STORAGE的权限标签未闭合,需补充/>,修正后为:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
二、正确的权限处理逻辑
针对你的需求,正确的权限检查与申请流程如下:
// 先判断是否已获取全文件访问权限 if (Environment.isExternalStorageManager()) { // 权限已授予,执行文件读写操作 } else { // 针对Android 10及以下,先检查普通存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } else { // 跳转系统设置页开启全文件访问权限 Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } }
三、代码放置位置
- 若在Activity中:可以放在
onCreate()方法(应用启动时自动检查权限),或某个功能按钮的点击事件里(用户触发操作时再申请权限)。 - 若在Fragment中:可以放在
onViewCreated()方法,或Fragment内按钮的onClickListener里,注意将代码中的this替换为getActivity()或requireContext()。
内容的提问来源于stack exchange,提问作者cellswithincells
相关产品推荐
相关产品推荐

