如何获取相机拍摄原始图片的Path或Uri?当前代码仅返回缩略图
解决方案:获取相机拍摄的原始图片Uri/路径
嘿,我懂你现在的困扰——你用这段代码只能拿到相机返回的缩略图,想要获取原始拍摄图片的真实路径或者Uri对吧?这是因为默认情况下,MediaStore.ACTION_IMAGE_CAPTURE返回的"data"字段本来就只提供小尺寸的缩略图,要拿到原始图得换个思路:提前告诉相机把图片保存到你指定的位置,然后直接用这个位置的Uri/路径就行。
下面是具体的实现步骤:
1. 配置相机Intent,指定原始图片的保存Uri
首先你需要创建一个临时文件(或用FileProvider生成内容Uri),让相机把拍摄的原始图片直接保存到这里,而不是依赖系统返回的缩略图。示例代码如下:
private Uri mImageUri; private String mCurrentPhotoPath; // 用于保存图片的绝对路径 private static final int REQUEST_IMAGE_CAPTURE = 1; // 启动相机的方法 private void launchCamera() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 先确认设备上有相机应用可以处理这个Intent if (takePictureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; try { photoFile = createTempImageFile(); } catch (IOException e) { // 处理文件创建失败的异常,比如提示用户 e.printStackTrace(); Toast.makeText(this, "图片文件创建失败", Toast.LENGTH_SHORT).show(); return; } if (photoFile != null) { // Android 7.0及以上必须用FileProvider获取内容Uri,避免FileUriExposedException mImageUri = FileProvider.getUriForFile( this, "com.your.package.name.fileprovider", // 替换成你的应用包名+fileprovider photoFile ); // 告诉相机把原始图片保存到这个Uri takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } // 创建临时图片文件的辅助方法 private File createTempImageFile() throws IOException { // 生成唯一的文件名,避免重复 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; // 保存到应用私有图片目录,Android 10+不需要额外权限 File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File imageFile = File.createTempFile( imageFileName, ".jpg", storageDir ); // 记录图片的绝对路径 mCurrentPhotoPath = imageFile.getAbsolutePath(); return imageFile; }
2. 在Activity返回结果中获取原始图片的路径/Uri
当相机拍摄完成返回后,你不需要再从data里取数据,直接用之前保存的mCurrentPhotoPath(绝对路径)或者mImageUri即可:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 直接传递原始图片的路径给下一个Activity Intent intent = new Intent(IdentifyActivity.this, detailedActivity.class); intent.putExtra("PATH", mCurrentPhotoPath); // 也可以传递Uri:intent.putExtra("IMAGE_URI", mImageUri.toString()); startActivity(intent); } }
3. 关键配置:FileProvider(针对Android 7.0+)
如果你的应用适配Android 7.0及以上版本,必须配置FileProvider来避免文件Uri暴露的异常:
- 在
AndroidManifest.xml中添加Provider配置:
<application> <!-- 其他配置 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.your.package.name.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
- 在
res/xml目录下创建file_paths.xml文件:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 指定应用私有图片目录的访问路径 --> <external-files-path name="my_images" path="Pictures" /> </paths>
补充说明
你之前的代码只能拿到缩略图,是因为当没有给相机Intent指定MediaStore.EXTRA_OUTPUT时,系统才会把压缩后的缩略图放到extras.get("data")中;一旦指定了EXTRA_OUTPUT,相机就会把原始尺寸的图片保存到你指定的Uri,此时返回的data会是null,你直接用提前保存的Uri/路径即可。
内容的提问来源于stack exchange,提问作者Satyaraj Moily
相关产品推荐
相关产品推荐

