Android 13下Expo Image Picker无法访问全部相册的解决方案咨询
Android 13下访问全部相册的解决方案
核心原因
Android 13(API 33)引入了媒体权限细分机制,原有的READ_EXTERNAL_STORAGE权限被拆分为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO三类。同时系统默认的媒体选择器(即launchImageLibrary调用的组件)默认仅展示用户常用相册,无法直接访问全部文件夹。
具体解决方法
1. 申请完整媒体访问权限(API 33+适配)
在AndroidManifest.xml中声明所需权限:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 如需访问视频,额外添加以下权限 --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
在代码中动态申请权限:
// Kotlin示例 private const val REQUEST_CODE_MEDIA = 1001 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requestPermissions( arrayOf(Manifest.permission.READ_MEDIA_IMAGES), REQUEST_CODE_MEDIA ) } else { requestPermissions( arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_CODE_MEDIA ) }
2. 自定义相册界面替代系统选择器
若要访问所有文件夹(包括系统隐藏相册或非媒体目录),无法依赖launchImageLibrary,需基于MediaStore实现自定义遍历逻辑:
- 通过
MediaStore.Images.Media.EXTERNAL_CONTENT_URI查询所有图片,提取RELATIVE_PATH字段获取文件夹路径 - 去重整理所有文件夹,再分别加载对应文件夹下的媒体文件
示例代码片段:
// 查询所有图片及所属文件夹 val projection = arrayOf( MediaStore.Images.Media._ID, MediaStore.Images.Media.RELATIVE_PATH, MediaStore.Images.Media.DISPLAY_NAME ) contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null )?.use { cursor -> val pathColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.RELATIVE_PATH) val folders = mutableSetOf<String>() while (cursor.moveToNext()) { val fullPath = cursor.getString(pathColumn) val folderPath = fullPath.substring(0, fullPath.lastIndexOf('/')) folders.add(folderPath) } // folders集合即为所有包含图片的文件夹路径 }
3. 注意事项
- Android 13及以上版本,即使申请了
READ_MEDIA_IMAGES,系统默认媒体选择器仍可能限制展示的相册数量,这是系统默认行为,只能通过自定义界面绕过 - 除非你的应用属于文件管理器类,否则不要申请
MANAGE_EXTERNAL_STORAGE权限,该权限会导致Google Play审核不通过
内容的提问来源于stack exchange,提问作者matar cohen
相关产品推荐
相关产品推荐

