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

Android 13(API33)应用启动时WRITE_EXTERNAL_STORAGE权限弹窗不显示

Android 13下WRITE_EXTERNAL_STORAGE权限申请无弹窗问题解决

问题原因

Android 13(API 33)对存储权限体系做了核心调整:

  • WRITE_EXTERNAL_STORAGE权限已被废弃,系统会直接忽略针对该权限的动态申请请求,因此不会弹出权限弹窗。
  • 针对媒体文件访问,系统拆分出细分权限,比如读取音频文件需使用READ_MEDIA_AUDIO。
  • requestLegacyExternalStorage属性仅在Android 10(API 29)生效,API 30及以上系统会忽略该配置。

解决方案

1. 更新Manifest权限配置

替换原有权限,添加适配不同API级别的权限声明:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
  • WRITE_EXTERNAL_STORAGE仅保留给API 32及以下版本使用。
  • READ_MEDIA_AUDIO用于Android 13及以上版本读取音频文件。

2. 修改动态权限申请代码

根据系统API版本,申请对应权限:

private fun requestRunTimePermission(): Boolean {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        // Android 13及以上,申请音频读取权限
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_MEDIA_AUDIO)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_MEDIA_AUDIO), 13)
            false
        } else {
            true
        }
    } else {
        // Android 12及以下,申请外部存储写入权限
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 13)
            false
        } else {
            true
        }
    }
}

3. 更新权限回调逻辑

优化回调处理,避免无限弹窗:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == 13) {
        val permissionGranted = grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
        if (permissionGranted) {
            Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "权限被拒绝,应用无法读取音频文件", Toast.LENGTH_SHORT).show()
        }
    }
}

额外说明

  • 若应用仅需写入自身创建的音频文件,Android 13及以上版本无需额外权限,直接通过MediaStore API写入即可。
  • 若需修改其他应用创建的音频文件,需申请MANAGE_EXTERNAL_STORAGE特殊权限,但该权限仅适用于文件管理器类应用,需在应用商店说明用途。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:53