Android 拍照后如何区分触发按钮并更新对应ImageView资源
问题核心原因
- 两个按钮触发拍照时都使用了相同的请求码,
onActivityResult无法区分拍照请求的触发来源,导致你现在只要有一次拍照完成就会同时修改两个ImageView的资源 - 取消拍照的分支存在代码错误:
setImageResource()方法只能接收Drawable类型的资源ID,你给第二个ImageView传入了字符串资源,运行时会触发崩溃
修复方案
第一步:新增区分按钮的请求码
在类成员变量位置新增两个独立的拍照请求码:
// 原有变量保留,新增两个不同的拍照请求码 static final int IMAGE_REQUEST_BTN1 = 1; static final int IMAGE_REQUEST_BTN2 = 3; private static final int PERMISSION_REQUEST = 2; ImageView imageV, imageV2;
第二步:修改按钮触发逻辑,传入对应请求码
两个按钮启动拍照时分别传入不同的请求码:
// 第一个按钮逻辑 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent camara = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (camara.resolveActivity(getPackageManager()) != null) { // 传第一个按钮的请求码 startActivityForResult(camara, IMAGE_REQUEST_BTN1); } } }); // 第二个按钮逻辑 btnIne.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent camara = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (camara.resolveActivity(getPackageManager()) != null) { // 传第二个按钮的请求码 startActivityForResult(camara, IMAGE_REQUEST_BTN2); } } });
第三步:改造onActivityResult逻辑,按请求码更新对应控件
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理第一个按钮的拍照结果 if (requestCode == IMAGE_REQUEST_BTN1) { if (resultCode == Activity.RESULT_OK) { imageV.setImageResource(R.drawable.image_view_2do); } else { imageV.setImageResource(R.drawable.image_view_1er); } } // 处理第二个按钮的拍照结果 else if (requestCode == IMAGE_REQUEST_BTN2) { if (resultCode == Activity.RESULT_OK) { imageV2.setImageResource(R.drawable.image_view2_2do); } else { // 修正原来的错误,传入drawable资源ID而非字符串 imageV2.setImageResource(R.drawable.image_view2_1er); } } }
补充说明
如果你需要将相机实际拍摄的照片设置到ImageView,而非切换预设drawable,需要额外处理data.getExtras().get("data") 拿到的缩略图,或者配置FileProvider存储拍摄的原图再加载。
内容的提问来源于stack exchange,提问作者Rick V
相关产品推荐
相关产品推荐

