Android 11及以上无需MANAGE_EXTERNAL_STORAGE权限访问照片的方法
Android 11+ 无需MANAGE_EXTERNAL_STORAGE权限访问照片的替代方案
官方推荐的替代方案
MediaStore API:这是访问媒体文件的标准方式,无需
MANAGE_EXTERNAL_STORAGE权限。根据系统版本适配权限:- Android 13及以上:申请
READ_MEDIA_IMAGES权限即可读取所有照片。 - Android 11-12:申请
READ_EXTERNAL_STORAGE权限,该权限的审核门槛远低于MANAGE_EXTERNAL_STORAGE。
示例代码(Kotlin):
// 查询设备中的照片 val projection = arrayOf( MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATA ) val cursor = contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, "${MediaStore.Images.Media.DATE_ADDED} DESC" ) cursor?.use { while (it.moveToNext()) { // 获取照片ID和名称 val id = it.getLong(it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)) val name = it.getString(it.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)) // 通过ID构建Uri访问照片 val photoUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) // 读取照片内容... } }- Android 13及以上:申请
系统照片选择器:直接调用系统提供的选择器,无需申请任何存储权限,用户自主选择照片后,应用通过返回的Uri读取内容。
示例代码(Kotlin):// 启动照片选择器 val pickIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) startActivityForResult(pickIntent, REQUEST_PICK_PHOTO) // 在onActivityResult中处理选中的照片 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_PICK_PHOTO && resultCode == RESULT_OK) { data?.data?.let { photoUri -> // 通过Uri读取照片文件流 val inputStream = contentResolver.openInputStream(photoUri) // 处理照片内容... } } }Android 13+还支持
ACTION_OPEN_DOCUMENT实现多选,且可获取持久访问权限,适合需要长期访问用户选中照片的场景。存储访问框架(SAF):通过
ACTION_OPEN_DOCUMENT_TREE让用户选择特定文件夹,应用获得该文件夹的访问权限,可读取其中的所有照片。这种方式完全遵循系统权限模型,不会触发Play商店的审核问题。
权限适配注意事项
- 所有替代方案都不需要
MANAGE_EXTERNAL_STORAGE权限,完全符合Google Play的政策要求。 - 申请
READ_EXTERNAL_STORAGE或READ_MEDIA_IMAGES时,要在应用描述和权限弹窗中明确说明用途(比如“用于读取照片以进行编辑/上传”),避免审核被拒。
内容的提问来源于stack exchange,提问作者Jibrin Onanefe Israel
相关产品推荐
相关产品推荐

