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

Android如何从AlertDialog向ActivityResultLauncher传递获取product_id

问题原因

你无法获取product_id是两个逻辑错误导致的:

  • 你传给相机Intent的自定义Extra是给系统相机Activity的,但系统相机的ACTION_IMAGE_CAPTURE协议仅识别官方约定的固定参数(比如指定照片输出路径的MediaStore.EXTRA_OUTPUT),根本不会处理你自定义的GET_PRODUCT_ID,更不会在拍照完成后把这个参数塞回返回的结果Intent,所以从result.getData()里读不到值。
  • getIntent()返回的是启动你当前Activity的初始Intent,你临时创建用来启动相机的camIntent和它没有关联,自然也不可能从这里读到你塞给相机的参数。
实现方案

根据你的业务场景,选以下任意一种方案即可实现需求:

方案1:ViewModel暂存商品ID(推荐,兼容屏幕旋转等配置变更)

用ViewModel存储当前正在拍摄的商品ID,不会因为Activity重建丢失数据:

// 定义承载拍摄状态的ViewModel
public class ShootViewModel extends ViewModel {
    public MutableLiveData<String> currentProductId = new MutableLiveData<>();
}

// Activity中初始化
private ShootViewModel shootViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    shootViewModel = new ViewModelProvider(this).get(ShootViewModel.class);
    // 其余原有初始化逻辑
}

// AlertDialog按钮点击启动相机的逻辑
Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 启动相机前先把当前商品ID存入ViewModel
shootViewModel.currentProductId.setValue(product_id);
// 如果需要拍摄全尺寸商品图,记得在此处通过MediaStore.EXTRA_OUTPUT指定照片保存Uri
activityResultLauncherStartCamera.launch(camIntent);

// ActivityResultLauncher回调逻辑
ActivityResultLauncher<Intent> activityResultLauncherStartCamera = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == Activity.RESULT_OK){
                String productId = shootViewModel.currentProductId.getValue();
                // 拿到productId后,拼接旧图片存储路径,判断文件存在即可删除
                // 处理完成后清空暂存的ID,避免后续逻辑误读
                shootViewModel.currentProductId.setValue(null);
            }
        }
);

方案2:SavedStateRegistry暂存ID(轻量场景使用)

如果不想引入ViewModel,可以借助SavedStateRegistry暂存ID,同样能兼容配置变更导致的Activity重建:

private final String KEY_SAVE_PRODUCT_ID = "save_product_id";
private String currentShootProductId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 注册状态保存回调
    getSavedStateRegistry().registerSavedStateProvider(KEY_SAVE_PRODUCT_ID, () -> {
        Bundle bundle = new Bundle();
        bundle.putString(KEY_SAVE_PRODUCT_ID, currentShootProductId);
        return bundle;
    });
    // 恢复重建前暂存的ID
    Bundle restoreBundle = getSavedStateRegistry().consumeRestoredStateForKey(KEY_SAVE_PRODUCT_ID);
    if (restoreBundle != null) {
        currentShootProductId = restoreBundle.getString(KEY_SAVE_PRODUCT_ID);
    }
}

// 启动相机前给成员变量赋值
currentShootProductId = product_id;
activityResultLauncherStartCamera.launch(camIntent);

// 回调中直接读取currentShootProductId即可使用,使用完记得置空

注意:如果需要获取全尺寸商品照片,不要依赖相机返回Intent携带的缩略图,必须在启动相机前通过MediaStore.EXTRA_OUTPUT传入自定义的文件输出Uri,否则大部分机型上只会返回分辨率极低的缩略图,无法满足商品图使用要求。

内容的提问来源于stack exchange,提问作者Wong Yat Cheong Jacky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:51:24