假设 ActivityResultContract 的 extend 是您所需要的。
尝试:
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 选择器应该有原生支持,否则我可能错过了什么。