Android调用相机拍照上传Firebase提示未找到图片如何解决
问题根源
你调用系统相机ACTION_IMAGE_CAPTURE时没有主动指定图片输出路径,系统返回的Intent里getData()默认返回null,只会在extra中携带低清晰度的缩略图,不会返回完整图片的Uri,所以你给filePath赋值失败,上传时自然提示找不到图片。
修复步骤
1. 配置FileProvider(适配安卓7.0+的文件访问限制)
首先在AndroidManifest.xml的<application>标签内添加FileProvider声明:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
然后在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>
2. 新增全局变量保存拍照输出的Uri
在Activity类中新增变量:
private Uri cameraImageUri; // 保存拍照输出的Uri
3. 修改拍照逻辑,指定图片输出路径
修改imageSelect方法里的拍照分支代码:
if (options[item].equals("Take Photo")) { Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 创建拍照输出的图片文件 File photoFile = null; try { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); photoFile = File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); // 获取文件的Uri cameraImageUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", photoFile); takePicture.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri); startActivityForResult(takePicture, 0); } catch (IOException ex) { ex.printStackTrace(); Toast.makeText(context, "创建图片文件失败", Toast.LENGTH_SHORT).show(); } }
4. 修改onActivityResult的拍照分支
不需要从返回的Intent里拿Uri,直接用之前创建的cameraImageUri即可:
case 0: if(resultCode == RESULT_OK){ filePath = cameraImageUri; // 直接用我们提前创建的Uri // 可选:把图片插到系统相册方便查看 Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(cameraImageUri); sendBroadcast(mediaScanIntent); } break;
额外注意事项
- 提前动态申请相机权限、存储读写权限,安卓13+需要申请
READ_MEDIA_IMAGES权限 - 如果使用的是新版AndroidX,建议改用
Activity Result API替代已经废弃的startActivityForResult方法
内容的提问来源于stack exchange,提问作者Anon5678
相关产品推荐
相关产品推荐

