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

Android 13中申请WRITE_EXTERNAL_STORAGE运行时权限问题求助

Android 13中申请外部存储写入权限的问题分析与解决

你的代码核心错误

  • 你目标是申请WRITE_EXTERNAL_STORAGE,但代码全程检查、申请的是ACCESS_FINE_LOCATION(精确定位权限),完全搞错了权限类型。
  • 方法末尾直接返回false,忽略权限申请状态,逻辑不合理。

Android 13(API 33)的外部存储权限变化

Android 13开始废弃WRITE_EXTERNAL_STORAGE权限,根据文件类型不同,权限规则有以下调整:

1. 访问媒体文件(图片、视频、音频)

  • 读取媒体文件:需按需申请READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO权限。
  • 写入媒体文件:Android 13及以上无需额外权限,可直接写入系统媒体集合。

2. 访问非媒体文件(文档、下载目录的非媒体文件等)

  • 需要申请MANAGE_EXTERNAL_STORAGE特殊权限,该权限无法通过常规弹窗申请,必须引导用户到系统设置手动开启;且Google Play对该权限的使用场景审核严格,仅允许文件管理器类等必要应用使用。

修正后的代码示例

场景一:处理媒体文件

第一步:在Manifest中声明权限

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- 按需添加READ_MEDIA_VIDEO、READ_MEDIA_AUDIO -->

第二步:权限检查与申请代码

private boolean checkMediaPermissions() {
    // 以读取图片权限为例
    int imagePermission = ContextCompat.checkSelfPermission(getActivity(), 
            Manifest.permission.READ_MEDIA_IMAGES);
    
    if (imagePermission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(),
                new String[]{Manifest.permission.READ_MEDIA_IMAGES}, 100);
        return false;
    }
    return true;
}

// 处理权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
        @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限授予成功,执行媒体文件相关操作
        } else {
            // 权限被拒绝,可提示用户开启权限
        }
    }
}

场景二:处理非媒体文件

第一步:在Manifest中声明权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30" />

第二步:权限检查与引导开启代码

private boolean checkManageStoragePermission() {
    if (!Environment.isExternalStorageManager()) {
        // 跳转到系统设置页面引导开启权限
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
        intent.setData(uri);
        startActivityForResult(intent, 200);
        return false;
    }
    return true;
}

// 处理设置页面返回结果
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 200) {
        if (Environment.isExternalStorageManager()) {
            // 权限已开启,执行非媒体文件操作
        } else {
            // 用户未开启权限,无法进行相关操作
        }
    }
}

内容的提问来源于stack exchange,提问作者MARSH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:40:33