如何将相册选图代码中的startActivityForResult替换为ActivityResultLauncher
替换startActivityForResult实现相册选图的修改方案
修改步骤
1. 新增成员变量ActivityResultLauncher
在类的成员变量位置声明选图启动器,用于接收相册返回的结果,替代原来的onActivityResult回调逻辑:
// 选图启动器,替换废弃的startActivityForResult private ActivityResultLauncher<Intent> pickImageLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { // 这里拿到选中的图片Uri,后续可以用来加载、上传等操作 Uri selectedImageUri = result.getData().getData(); // 示例:把选中的图片设置到ImageView binding.addphotoImage.setImageURI(selectedImageUri); // 你可以在这里添加自己的业务逻辑,比如存到全局变量、触发上传等 } } );
2. 替换所有启动相册的调用
把原来所有调用startActivityForResult的地方,替换成启动器的launch方法:
原来的
startActivityForResult(intent, PICK_IMAGE_FROM_ALBUM);
替换为
pickImageLauncher.launch(intent);
完整修改后的代码
public class AddPhotoActivity extends AppCompatActivity implements View.OnClickListener { private ActivityAddPhotoBinding binding; private String Url; private FirebaseStorage firebaseStorage; // 新增的选图启动器 private ActivityResultLauncher<Intent> pickImageLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Uri selectedImageUri = result.getData().getData(); // 此处添加你自己的逻辑,比如加载图片、赋值给全局Url变量、触发上传等 binding.addphotoImage.setImageURI(selectedImageUri); } } ); // 原来的请求码常量如果没有其他地方用可以直接删掉 private static final int PICK_IMAGE_FROM_ALBUM = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_add_photo); binding.addphotoBtnUpload.setOnClickListener(this); // 打开相册(已替换启动方式) Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); pickImageLauncher.launch(intent); // Firebase storage firebaseStorage = FirebaseStorage.getInstance(); binding.addphotoImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); pickImageLauncher.launch(intent); } }); } @Override public void onClick(View v) { // 你原来的点击事件逻辑保留即可 } }
额外注意事项
- 调用相册前需要先申请存储权限:Android 13(API 33)及以上版本需要申请
READ_MEDIA_IMAGES权限,Android 12及以下版本需要申请READ_EXTERNAL_STORAGE权限,未授权直接调用会出现权限错误 - 拿到的Uri是内容Uri,可以直接用于加载到ImageView,也可以用来获取文件流上传到Firebase Storage
内容的提问来源于stack exchange,提问作者Ally
相关产品推荐
相关产品推荐

