为什么调用相机Intent拍照返回后,图片无法显示到ImageView中?
问题根因与修复方案
核心错误点
- onActivityResult方法位置错误:你把
onActivityResult写在了OnClickListener的匿名内部类里,系统不会回调这个位置的方法,它必须作为MainActivity的成员方法才能被系统正确触发。 - 控件查找范围错误:你当前用
findViewById(R.id.a)是在Activity的全局布局里找控件,但目标ImageView属于自定义对话框的布局custom_dialog.xml,直接在Activity层级查找会返回null,就算回调触发也无法设置图片。 - 变量作用域问题:要保证
fileUri和对话框View的作用域足够,能被onActivityResult访问到。
修复步骤
- 第一步:在MainActivity中定义全局成员变量
public class MainActivity extends AppCompatActivity { private Uri fileUri; private View deleteDialogView; private static final int TAKE_PICTURE = 1001; // 其他原有代码 }
- 第二步:将
onActivityResult移到MainActivity成员方法层级
// 该方法与onMapLongClick平级,属于MainActivity的成员方法 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) { // 从对话框的布局实例中查找ImageView ImageView imgView = deleteDialogView.findViewById(R.id.a); if (imgView != null && fileUri != null) { imgView.setImageURI(fileUri); } } }
- 第三步:调整onMapLongClick中的代码逻辑,移除OnClickListener内部的onActivityResult
public void onMapLongClick(LatLng point) { LayoutInflater factory = LayoutInflater.from(MainActivity.this); deleteDialogView = factory.inflate(R.layout.custom_dialog, null); final AlertDialog deleteDialog = new AlertDialog.Builder(MainActivity.this).create(); deleteDialog.setView(deleteDialogView); deleteDialogView.findViewById(R.id.btn_photo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String f = System.currentTimeMillis()+".jpg"; File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), f); fileUri = FileProvider.getUriForFile(MainActivity.this, getPackageName() + ".fileprovider", file); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(cameraIntent, TAKE_PICTURE); } }); // 补充原有保存、取消按钮逻辑,以及对话框show逻辑 deleteDialog.show(); }
- 额外注意:如果项目targetSdkVersion < 29,需要动态申请存储权限才能正常读写照片;如果拍摄的图片分辨率很高,建议先压缩再加载到ImageView,避免出现OOM问题。
内容的提问来源于stack exchange,提问作者user6694876
相关产品推荐
相关产品推荐

