Android 11/12中Photo Picker库未打开图库,调用ACTION_OPEN_DOCUMENT问题
问题原因
系统原生的Photo Picker界面仅在Android 13(API33)及以上系统默认内置。对于Android 11-12(API30-31)设备,需要依赖Google Play服务来提供一致的Photo Picker体验。如果设备上的Google Play服务版本低于22.09.13,系统会自动降级使用ACTION_OPEN_DOCUMENT的默认文件选择器,而非显示Photo Picker界面。
解决方案
1. 验证Google Play服务版本
在设备上检查Google Play服务版本:设置 -> 应用 -> 查看全部应用 -> 找到“Google Play服务”查看版本号。需确保版本≥22.09.13,若低于此版本,引导用户更新Google Play服务。
2. 确保依赖正确的Activity Result库
在Module级别的build.gradle中,确保依赖最新的Activity和Fragment库(Photo Picker API依赖这些库实现):
dependencies { implementation "androidx.activity:activity-ktx:1.8.0+" implementation "androidx.fragment:fragment-ktx:1.6.0+" }
3. 修复URI处理逻辑(关键)
你当前使用的getRealPathFromMediaURI方法依赖MediaStore.MediaColumns.DATA列,该字段在Android 10(API29)及以上已被废弃,且在Scoped Storage策略下无法可靠获取真实文件路径。正确的做法是直接通过ContentResolver访问URI对应的文件流,而非获取真实路径:
// 替代原getRealPathFromMediaURI的方法,将URI对应的文件复制到本地缓存 fun getFileFromUri(context: Context, uri: Uri): File? { val tempFile = File(context.cacheDir, "temp_media_${System.currentTimeMillis()}") return try { context.contentResolver.openInputStream(uri)?.use { inputStream -> tempFile.outputStream().use { outputStream -> inputStream.copyTo(outputStream) } } tempFile } catch (e: Exception) { e.printStackTrace() null } }
4. (可选)自定义降级处理
如果需要强制统一的选择器界面,可判断设备API级别和Google Play服务版本,当不满足Photo Picker运行条件时,启动自定义图片选择器,而非依赖系统降级逻辑。
代码修正示例
修改Photo Picker的回调逻辑,使用新的文件处理方式:
private fun registerPhotoPicker() { pickMultipleMediaLauncher = registerForActivityResult(PickMultipleVisualMedia(imageSelectionLimitCount)) { uris -> uris.forEach { uri -> getFileFromUri(context, uri)?.let { file -> imagesPath.add(file.absolutePath) } } } }
内容的提问来源于stack exchange,提问作者Atinée Keshishi

