You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中还是其他文件里?

解决方法

一、代码中的错误点

  1. 语法错误:ActivityCompat.requestPermissions(.this, ...) 里的 .this 是错误写法,在Activity中直接用 this 即可,Fragment中则替换为 getActivity()。
  2. 权限申请逻辑错误:MANAGE_EXTERNAL_STORAGE 是Android 11+的特殊权限,不能通过 requestPermissions() 弹窗申请,只能跳转系统设置让用户手动开启,你代码里的else分支逻辑是对的,但前面将该权限混入普通权限申请是无效操作。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:26