【问题标题】:Can you create a chooser for several ```ActivityResultLauncher``` objects?你可以为几个 ```ActivityResultLauncher``` 对象创建一个选择器吗?
【发布时间】:2021-08-23 15:06:16
【问题描述】:

作为一些背景信息,我的团队正在开展一个用户需要上传照片和/或视频的项目。基本上,当有人点击上传按钮时,他们会得到一个选择器意图 (Intent.createChooser()),他们会从中选择几个活动之一(例如 GET_CONTENT 上传现有照片,一个用相机拍摄一张等)一旦选择了一个意图,startActivityForResult 方法就会被调用,并且宿主活动中的回调方法会处理输出。这对我们来说效果很好,但现在 startActivityForResult 方法已被弃用,我认为我们应该在旧方法停止工作之前迁移到 ActivityResultLauncher / registerForActivityResult 模式。我和我的队友真的很喜欢新的做事方式不那么依赖父活动,这使得封装更容易,更安全。但是,我们不确定如何为多个 ActivityResultLauncher 项目创建选择器。人们通常是怎么做的?感觉我们有一个非常常见的用例(从各种来源上传照片和视频),但 StackOverflow 和类似资源已经被现在已弃用的解决方案所饱和。

【问题讨论】:

    标签: java android-studio android-intent


    【解决方案1】:

    假设 ActivityResultContractextend 是您所需要的。

    尝试:

    public static class GetContentWithChooser extends ActivityResultContract<Pair<String, String>, Uri> {
    
        @NonNull @NotNull @Override public Intent createIntent(@NonNull @NotNull Context context, Pair<String, String> input) {
            Intent getContentIntent = new Intent(Intent.ACTION_GET_CONTENT);
            getContentIntent.setType(input.first);
            getContentIntent.addCategory(Intent.CATEGORY_OPENABLE);
            Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            pickIntent.setType(input.first);
            Intent chooserIntent = Intent.createChooser(getContentIntent, input.second);
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});
            return chooserIntent;
        }
    
        @Nullable @org.jetbrains.annotations.Nullable @Override public SynchronousResult<Uri> getSynchronousResult(@NonNull @NotNull Context context, Pair<String, String> input) {
            return super.getSynchronousResult(context, input);
        }
    
        @Nullable
        @Override
        public final Uri parseResult(int resultCode, @Nullable Intent intent) {
            if (intent == null || resultCode != Activity.RESULT_OK) return null;
            return intent.getData();
        }
    }
    

    并将其进一步称为:

    private ActivityResultLauncher<Pair<String,String>> pickFromGalleryLauncher = registerForActivityResult(
                new GetContentWithChooser(),
                result -> {
                    if (result != null) cropFile(result);
                }
        );
    

    其中 Pair 是选择器的媒体类型和标题

    pickFromGalleryLauncher.launch(Pair.create("image/*", "Select voucher"));
    

    但你是对的,Intent 选择器应该有原生支持,否则我可能错过了什么。

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多