如何调用SD卡直接访问权限请求对话框?
如何调用直接访问SD卡的权限对话框
你提到的这个直接访问权限对话框,对应的是Android 11(API 30)及以上系统引入的**「所有文件访问权限」**(权限标识为MANAGE_EXTERNAL_STORAGE),它能让应用绕过Storage Access Framework(SAF)直接访问外部存储的所有文件。不过要注意,Google Play对这个权限的审核非常严格,只有文件管理器、备份工具、反病毒软件这类有明确需求的应用才允许使用,普通应用优先建议用SAF来操作文件。
下面是具体的实现步骤:
1. 在Manifest中声明权限
首先需要在AndroidManifest.xml里添加权限声明,同时兼容低版本系统的存储权限:
<!-- Android 11+ 所需的全文件访问权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> <!-- Android 10及以下的读写权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
2. 检查权限状态
在代码里先判断是否已经获得了这个权限,Android提供了Environment.isExternalStorageManager()方法来快速校验:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val hasPermission = Environment.isExternalStorageManager() // 根据权限状态决定是否发起请求 }
3. 唤起权限请求对话框
如果还没获得权限,就需要启动系统设置的特定页面,也就是你截图里的那个对话框所在的界面。用以下代码实现:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { // 构建跳转到应用全文件权限设置的Intent val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) // 指定当前应用的包名,直接定位到本应用的权限设置页 val uri = Uri.fromParts("package", packageName, null) intent.data = uri // 启动页面,用户就能看到你截图里的权限请求对话框了 startActivity(intent) } } else { // 处理Android 10及以下的读写权限请求逻辑 ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE_STORAGE // 自定义请求码,用于后续权限回调处理 ) }
额外注意事项
- 即使拿到了
MANAGE_EXTERNAL_STORAGE权限,在Android 13(API 33)及以上系统中,针对媒体文件(图片、视频、音频)还有更细化的权限(比如READ_MEDIA_IMAGES),如果只是操作媒体文件,优先用这些细化权限更合规。 - 提交到Google Play的应用,必须在权限申请说明里明确阐述为什么需要全文件访问权限,否则会被拒绝上架。
内容的提问来源于stack exchange,提问作者Jordy Mendoza
相关产品推荐
相关产品推荐

