Android权限自动拒绝问题求助(API33、OnePlus Nord 2t)
解决Android 13(API33)下存储权限自动拒绝的问题
问题核心原因
Android 13(API 33)彻底重构了媒体存储权限体系,READ_EXTERNAL_STORAGE权限不再弹出请求弹窗,系统会直接自动拒绝该权限请求——这就是你看到"prompting"后立刻收到"not ok"的原因。这个权限在API33及以上版本已被废弃,需要使用更细分的媒体权限替代。
解决方案步骤
1. 更新AndroidManifest.xml中的权限声明
保留旧权限兼容API30-32版本,同时添加API33+所需的媒体权限:
<!-- 兼容API30-32的存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- API33+读取图片/视频权限 --> <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" />
2. 修改权限请求逻辑(Kotlin代码)
根据系统版本动态选择要请求的权限:
package com.example.testpermissions import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.Manifest import android.content.pm.PackageManager import android.os.Build import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private val STORAGE_PERMISSION_CODE = 101 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) checkAndRequestStoragePermission() } private fun checkAndRequestStoragePermission() { val requiredPermissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // API33+请求媒体权限,根据你的需求选择对应的权限 arrayOf(Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO) } else { // API30-32请求旧存储权限 arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) } // 检查是否所有权限都已授予 val allPermissionsGranted = requiredPermissions.all { ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED } if (allPermissionsGranted) { Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "请求权限中", Toast.LENGTH_SHORT).show() ActivityCompat.requestPermissions(this, requiredPermissions, STORAGE_PERMISSION_CODE) } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == STORAGE_PERMISSION_CODE) { // 检查是否所有请求的权限都被授予 val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } if (allGranted) { Toast.makeText(this, "权限请求成功", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show() } } } }
额外说明
- 你的OnePlus Nord 2T设备本身不会直接导致权限被拒,核心问题是Android 13的权限规则变更。
- 如果用户拒绝权限后勾选了"不再询问",后续请求会直接被拒绝,此时你需要引导用户到App设置页面手动开启权限。
内容的提问来源于stack exchange,提问作者chdarro
相关产品推荐
相关产品推荐

