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
相关产品推荐
相关产品推荐

