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

为什么调用相机Intent拍照返回后,图片无法显示到ImageView中?

问题根因与修复方案

核心错误点

  1. onActivityResult方法位置错误:你把onActivityResult写在了OnClickListener的匿名内部类里,系统不会回调这个位置的方法,它必须作为MainActivity的成员方法才能被系统正确触发。
  2. 控件查找范围错误:你当前用findViewById(R.id.a)是在Activity的全局布局里找控件,但目标ImageView属于自定义对话框的布局custom_dialog.xml,直接在Activity层级查找会返回null,就算回调触发也无法设置图片。
  3. 变量作用域问题:要保证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:05