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

startActivityForResult替代方案:迁移至新API实现Picasso图片获取

迁移图片选择代码到Activity Result API(配合Picasso使用)

没问题!自从startActivityForResult被废弃后,官方推荐用Activity Result API来处理这类跨页面结果回调的场景,下面是针对你的代码的完整迁移方案,两种写法任你选:

写法一:兼容原有Intent逻辑(和旧代码逻辑最接近)

首先在你的Activity类里定义一个全局的ActivityResultLauncher,然后在onCreate中完成注册:

// 全局声明Launcher
private ActivityResultLauncher<Intent> pickImageLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout);

    // 注册图片选择的Launcher,替代原来的onActivityResult
    pickImageLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            // 这里处理返回的结果,逻辑和旧的onActivityResult一致
            if (result.getResultCode() == RESULT_OK) {
                Intent data = result.getData();
                if (data != null && data.getData() != null) {
                    Uri mImageUri = data.getData();
                    // 依然用Picasso加载图片,这部分代码完全不用改
                    Picasso.get().load(mImageUri).into(productImage);
                }
            }
        }
    );
}

然后修改原来的openFileChooser方法,把startActivityForResult换成Launcher的launch方法:

private void openFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    // 用Launcher启动选择器,替代startActivityForResult
    pickImageLauncher.launch(intent);
}

写法二:使用官方封装的GetContent契约(更简洁推荐)

官方为常见的场景封装了专门的契约,比如选择文件/图片,用这个写法可以省去手动构建Intent的步骤:

// 全局声明简化版的Launcher
private ActivityResultLauncher<String> pickImageLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout);

    // 注册基于GetContent契约的Launcher
    pickImageLauncher = registerForActivityResult(
        new ActivityResultContracts.GetContent(),
        // 回调直接拿到选中的Uri,不需要判断resultCode
        uri -> {
            if (uri != null) {
                Picasso.get().load(uri).into(productImage);
            }
        }
    );
}

// 简化后的选择方法,一行搞定
private void openFileChooser() {
    // 传入图片的MIME类型,直接启动选择器
    pickImageLauncher.launch("image/*");
}

注意事项

  • 必须在Activity/Fragment的生命周期启动前(比如onCreate方法里)完成Launcher的注册,不能在点击事件等动态场景中注册,否则会抛出异常。
  • 如果是在Fragment中使用,代码逻辑完全一致,直接在Fragment的onCreate中注册Launcher即可。
  • 你的Picasso加载逻辑完全不需要改动,因为只是获取Uri的方式变了,Uri的使用和之前完全一样。

内容的提问来源于stack exchange,提问作者Nusry KR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:09:09