Android车辆管理App相机拍照后图片无法显示问题求助
相机拍照后图片无法显示的解决方案
问题根源
使用MediaStore.ACTION_IMAGE_CAPTURE时,默认不会通过intent.getData()返回拍摄图片的Uri,只会在intent.getExtras()中返回缩略图Bitmap,这就是相机拍照后图片无法显示的核心原因。必须指定一个输出文件Uri,让相机将原图保存到指定位置,才能获取到完整图片的Uri用于展示和上传。
修复步骤及代码修改
- 添加全局变量:用于存储相机输出Uri和标记权限请求类型
private Uri cameraImageUri; private String permissionRequestType;
- 生成临时文件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); }
- 修改相机Intent逻辑:启动相机时指定输出Uri
在相机按钮的权限通过后,替换原Intent代码:
else { cameraImageUri = createImageUri(); Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri); activityResultLauncher.launch(takePicture); }
- 调整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); } } } });
- 适配多权限请求:针对相机和存储权限的统一处理
将原单权限请求的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
相关产品推荐
相关产品推荐

