You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将相册选图代码中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:24:03