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

Android车辆管理App相机拍照后图片无法显示问题求助

相机拍照后图片无法显示的解决方案

问题根源

使用MediaStore.ACTION_IMAGE_CAPTURE时,默认不会通过intent.getData()返回拍摄图片的Uri,只会在intent.getExtras()中返回缩略图Bitmap,这就是相机拍照后图片无法显示的核心原因。必须指定一个输出文件Uri,让相机将原图保存到指定位置,才能获取到完整图片的Uri用于展示和上传。

修复步骤及代码修改

  1. 添加全局变量:用于存储相机输出Uri和标记权限请求类型
private Uri cameraImageUri;
private String permissionRequestType;
  1. 生成临时文件Uri:创建方法生成相机拍照的输出路径
private Uri createImageUri() {
    String imageFileName = "JPEG_" + System.currentTimeMillis() + "_";
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, imageFileName);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
  1. 修改相机Intent逻辑:启动相机时指定输出Uri
    在相机按钮的权限通过后,替换原Intent代码:
else {
    cameraImageUri = createImageUri();
    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri);
    activityResultLauncher.launch(takePicture);
}
  1. 调整ActivityResult处理逻辑:区分相册和相机返回的情况
activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {
        if (result.getResultCode() == RESULT_OK) {
            Intent intentFromResult = result.getData();
            if (intentFromResult != null && intentFromResult.getData() != null) {
                // 相册选择的图片
                imageData = intentFromResult.getData();
            } else {
                // 相机拍摄的图片,使用预先生成的Uri
                imageData = cameraImageUri;
            }
            if (imageData != null) {
                binding.addCarPicture.setImageURI(imageData);
            }
        }
    }
});
  1. 适配多权限请求:针对相机和存储权限的统一处理
    将原单权限请求的permissionLauncher替换为多权限版本:
ActivityResultLauncher<String[]> permissionLauncher;

// 在registerLauncher中初始化
permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
    @Override
    public void onActivityResult(Map<String, Boolean> result) {
        boolean allGranted = true;
        for (Boolean granted : result.values()) {
            if (!granted) {
                allGranted = false;
                break;
            }
        }
        if (allGranted) {
            if ("camera".equals(permissionRequestType)) {
                cameraImageUri = createImageUri();
                Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri);
                activityResultLauncher.launch(takePicture);
            } else if ("gallery".equals(permissionRequestType)) {
                Intent intentToGallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                activityResultLauncher.launch(intentToGallery);
            }
        } else {
            Toast.makeText(UploadActivity.this, "需要相关权限才能继续操作", Toast.LENGTH_LONG).show();
        }
    }
});

完整修改后的代码

public class UploadActivity extends AppCompatActivity {

    Uri imageData;
    Uri cameraImageUri;
    private String permissionRequestType;
    ActivityResultLauncher<Intent> activityResultLauncher;
    ActivityResultLauncher<String[]> permissionLauncher;
    private ActivityUploadBinding binding;
    private FirebaseStorage firebaseStorage;
    private FirebaseFirestore firebaseFirestore;
    private FirebaseAuth firebaseAuth;
    private StorageReference storageReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 隐藏标题栏及全屏设置
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getSupportActionBar().hide();

        binding = ActivityUploadBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        registerLauncher();

        // Firebase初始化
        firebaseStorage = FirebaseStorage.getInstance();
        firebaseFirestore = FirebaseFirestore.getInstance();
        firebaseAuth = FirebaseAuth.getInstance();
        storageReference = firebaseStorage.getReference();
    }

    public void selectImage(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("选择图片");
        builder.setMessage("请选择图片来源");

        builder.setPositiveButton("相机", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                boolean hasCameraPerm = ContextCompat.checkSelfPermission(UploadActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
                boolean hasStoragePerm = true;
                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
                    hasStoragePerm = ContextCompat.checkSelfPermission(UploadActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
                }

                if (!hasCameraPerm || !hasStoragePerm) {
                    List<String> permissions = new ArrayList<>();
                    if (!hasCameraPerm) permissions.add(Manifest.permission.CAMERA);
                    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q && !hasStoragePerm) {
                        permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                    }

                    if (ActivityCompat.shouldShowRequestPermissionRationale(UploadActivity.this, Manifest.permission.CAMERA)
                            || (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q && ActivityCompat.shouldShowRequestPermissionRationale(UploadActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
                        Snackbar.make(view, "需要相机权限才能拍照", Snackbar.LENGTH_INDEFINITE)
                                .setAction("授予权限", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        permissionRequestType = "camera";
                                        permissionLauncher.launch(permissions.toArray(new String[0]));
                                    }
                                }).show();
                    } else {
                        permissionRequestType = "camera";
                        permissionLauncher.launch(permissions.toArray(new String[0]));
                    }
                } else {
                    cameraImageUri = createImageUri();
                    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri);
                    activityResultLauncher.launch(takePicture);
                }
                dialogInterface.dismiss();
            }
        });

        builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });

        builder.setNegativeButton("相册", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if (ContextCompat.checkSelfPermission(UploadActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(UploadActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                        Snackbar.make(view, "需要相册权限才能选择图片", Snackbar.LENGTH_INDEFINITE)
                                .setAction("授予权限", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        permissionRequestType = "gallery";
                                        permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE});
                                    }
                                }).show();
                    } else {
                        permissionRequestType = "gallery";
                        permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE});
                    }
                } else {
                    Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    activityResultLauncher.launch(pickPhoto);
                }
                dialogInterface.dismiss();
            }
        });

        AlertDialog dialog = builder.create();
        dialog.show();
    }

    private Uri createImageUri() {
        String imageFileName = "JPEG_" + System.currentTimeMillis() + "_";
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, imageFileName);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    }

    private void registerLauncher() {
        activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result.getResultCode() == RESULT_OK) {
                    Intent intentFromResult = result.getData();
                    if (intentFromResult != null && intentFromResult.getData() != null) {
                        imageData = intentFromResult.getData();
                    } else {
                        imageData = cameraImageUri;
                    }
                    if (imageData != null) {
                        binding.addCarPicture.setImageURI(imageData);
                    }
                }
            }
        });

        permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
            @Override
            public void onActivityResult(Map<String, Boolean> result) {
                boolean allGranted = true;
                for (Boolean granted : result.values()) {
                    if (!granted) {
                        allGranted = false;
                        break;
                    }
                }
                if (allGranted) {
                    if ("camera".equals(permissionRequestType)) {
                        cameraImageUri = createImageUri();
                        Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri);
                        activityResultLauncher.launch(takePicture);
                    } else if ("gallery".equals(permissionRequestType)) {
                        Intent intentToGallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        activityResultLauncher.launch(intentToGallery);
                    }
                } else {
                    Toast.makeText(UploadActivity.this, "需要相关权限才能继续操作", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

关键说明

  • 通过MediaStore.EXTRA_OUTPUT指定相机输出Uri,确保能获取到原图的完整路径
  • 区分相册和相机的返回逻辑,相机返回时直接使用预先生成的Uri
  • 适配Android版本权限差异,Android 11+无需WRITE_EXTERNAL_STORAGE权限,通过MediaStore插入即可完成图片存储

内容的提问来源于stack exchange,提问作者Sezer Ercan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:05:34