我正在尝试实现新的Android 照片选择器,但在尝试在旧设备上设置自动安装向后移植的照片选择器模块时遇到了问题。
根据文档,我们需要将以下内容添加到应用程序的清单文件中以允许这样做:
<!-- Trigger Google Play services to install the backported photo picker module -->
<service android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我在 Android Studio 中收到有关“com.google.android.gms.metadata.ModuleDependency”未被识别或解析的错误。
我们该如何解决这个问题?
SwiftUI PhotoPicker 非常适合创建要按下的按钮/标签,然后在按下标签时显示照片选择器。但是,我想在按下选择器标签后而不是在条件测试通过后调用照片选择器。
例如,如果用户单击将调用照片选择器的按钮,我想首先检查图像将附加到的记录是否已保存。如果记录已保存,我想启动选择器。如果尚未保存,我会显示一条警报,询问他们是否要保存或取消。如果他们选择保存,我将保存记录,然后我想自动调用照片选择器。
那么我可以以编程方式调用选取器而不是让用户单击它吗?谢谢你的建议!
我的目标是 Android 13 并使用新的照片选择器来检索图像。例如
val photoPicker = rememberLauncherForActivityResult(
contract = ActivityResultContracts.PickMultipleVisualMedia()
) { uris: List<Uri> -> handleUris(context, uris) ) }) }
photoPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
fun handleUris(context: Context, uris: List<Uri>) {
for (uri in uris) {
context.contentResolver.openInputStream(uri)!!.use { stream ->
ExifInterface(stream).let { exif ->
val dateTime = exif.dateTime // present
val latLng = exif.latLong // always null
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了什么:
自 Android 10 起,当您检索媒体时,GPS 信息不再包含在 EXIF 数据中。根据 2019 年的这段视频,您需要请求运行时权限ACCESS_MEDIA_LOCATION
。
他们解释说这是一个运行时权限,但用户无法在系统设置中看到该权限(这本身就很奇怪)。他们还声称您需要READ_EXTERNAL_STORAGE
媒体许可。
这篇文档还讨论了媒体位置权限。
使用以下方式请求许可 …
android runtime-permissions android-jetpack-compose android-exifinterface photo-picker
参考该功能 -> https://developer.android.com/training/data-storage/shared/photopicker#device-availability
代码及解释一
我创建一个请求,该请求将打开照片和视频选择器,选择 uri 列表后返回到侦听器中
PickVisualMediaRequest request =
new PickVisualMediaRequest.Builder()
.setMediaType(ActivityResultContracts.PickVisualMedia.ImageAndVideo.INSTANCE)
.build();
pickVisualMediaRequestActivityResultLauncher.launch(request);
Run Code Online (Sandbox Code Playgroud)
代码及解释二
以下代码注册活动结果监听器,并在使用照片选择器选择照片/视频时执行
pickVisualMediaRequestActivityResultLauncher =
registerForActivityResult(new ActivityResultContracts.PickMultipleVisualMedia(10),
result -> {
//Handling Here what to do with result (List<Uri>)
}
);
Run Code Online (Sandbox Code Playgroud)
问题是我在 PickMultipleVisualMedia 的构造函数中给媒体文件设置了 10 个限制,用户选择 5 个项目并返回到本地创建的预览屏幕,然后决定选择剩余的 5 个项目,那么我无法找到使这 5 个项目文件已在照片选择器中选择,无法将已选择的 uri 传递给选择器功能,用户必须再次选择所有 10 个文件,有什么解决方案吗?因为我在 Picker 类中找不到任何允许我这样做的函数。