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

Android 13(TargetSdk 33)Java文件权限申请问题求助

Android SDK33权限申请弹窗不显示问题解决

问题根源

Android 13(SDK33)彻底废弃了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE这两个传统存储权限,调用requestPermissions申请这两个权限时,系统不会弹出授权弹窗,直接默认"已授权"但实际没有读写媒体文件的权限。相机、录音权限的申请逻辑未变,问题核心出在存储权限的版本适配。

适配方案

1. 分版本动态构建权限数组

根据系统版本切换需要申请的权限集合:

String[] PERMISSIONS;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    // Android13及以上,使用细分媒体权限
    PERMISSIONS = new String[]{
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_MEDIA_IMAGES,
            Manifest.permission.READ_MEDIA_VIDEO,
            Manifest.permission.READ_MEDIA_AUDIO
    };
} else {
    // Android13以下,保留旧存储权限
    PERMISSIONS = new String[]{
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA
    };
}

if (!hasPermissions(this, PERMISSIONS)) {
    ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}

2. 更新Manifest权限声明

在AndroidManifest.xml中同时声明新旧权限,保证全版本兼容:

<!-- 旧存储权限,兼容Android12及以下 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- Android13及以上媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<!-- 相机、录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

3. 校验权限检查方法

确保你的hasPermissions方法能正确识别Android13的媒体权限状态,示例实现:

private boolean hasPermissions(Context context, String[] permissions) {
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

额外说明

  • Android13中写入媒体文件无需单独申请权限,直接通过MediaStore API操作即可;访问其他应用的媒体文件,仅需申请对应READ_MEDIA_*权限。
  • 若仅需访问应用私有文件,无需申请任何存储权限,直接使用getFilesDir()或getExternalFilesDir()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:25:31