我正在尝试使用Activity Result API来处理为我正在开发的应用程序选择单张照片的情况。我正在尝试使用预定义的合同之一来使事情变得简单。因此,我尝试使用ActivityResultContracts.PickVisualMedia()合约。
我将活动结果启动器设置如下:
private ActivityResultLauncher<PickVisualMediaRequest> pickVisualMediaActivityResultLauncher;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
pickVisualMediaActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.PickVisualMedia(),
this::onPickVisualMediaActivityResult
);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建PickVisualMediaRequest并在此处启动 Activity Result Launcher:
private void onSelectNewPhotoButtonClick() {
PickVisualMediaRequest request = new PickVisualMediaRequest.Builder()
.setMediaType(new ActivityResultContracts.PickVisualMedia.ImageOnly())
.build();
pickVisualMediaActivityResultLauncher.launch(request);
}
Run Code Online (Sandbox Code Playgroud)
问题是 Android Studio 抱怨 ActivityResultContracts.PickVisualMedia.ImageOnly() 没有适当的可见性来使用,即使它是有效的 VisualMediaType 并且文档暗示它应该这样使用:
我真的找不到关于这个特定场景的任何代码示例。我错过了什么吗?API 是否存在可见性缺陷,或者我今天只是愚蠢?
java android kotlin activity-result-api activityresultcontracts
参考该功能 -> 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 类中找不到任何允许我这样做的函数。