Java中如何将Bitmap图片转换为Uri?
在Java中将Bitmap转换为Uri
方法一:通过MediaStore插入(适配Android 10+,推荐)
这种方式符合Android 10及以上的存储权限规范,无需申请外部存储权限,将Bitmap插入系统媒体库后即可获取对应Uri:
private Uri bitmapToUriViaMediaStore(Context context, Bitmap bitmap) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "camera_capture_" + System.currentTimeMillis() + ".png"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyAppCaptures"); Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (uri == null) { return null; } try (OutputStream outputStream = context.getContentResolver().openOutputStream(uri)) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); return uri; } catch (IOException e) { // 插入失败时删除空条目 context.getContentResolver().delete(uri, null, null); e.printStackTrace(); return null; } }
对应你的相机场景使用示例:
Bundle extras = data.getExtras(); Bitmap cameraBitmapImage = (Bitmap) extras.get("data"); // 转换Bitmap为Uri Uri cameraImageUri = bitmapToUriViaMediaStore(this, cameraBitmapImage); if (cameraImageUri != null) { imageView.setImageURI(cameraImageUri); } else { // 转换失败时直接用Bitmap显示 imageView.setImageBitmap(cameraBitmapImage); } isImageSelected = true; imageBitmap = cameraBitmapImage;
方法二:保存到应用内部存储
如果不需要让其他应用访问该图片,可将Bitmap保存到应用内部存储,再通过FileProvider生成Uri:
- 在
AndroidManifest.xml中注册FileProvider:
<application> ... <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> </application>
- 在
res/xml目录下创建file_paths.xml:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="images" path="images/" /> </paths>
- 转换方法实现:
private Uri bitmapToUriViaInternalStorage(Context context, Bitmap bitmap) { File imagesDir = new File(context.getFilesDir(), "images"); if (!imagesDir.exists()) { imagesDir.mkdirs(); } File imageFile = new File(imagesDir, "camera_capture_" + System.currentTimeMillis() + ".png"); try (OutputStream outputStream = new FileOutputStream(imageFile)) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); return FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", imageFile); } catch (IOException e) { e.printStackTrace(); return null; } }
额外提示
- 若只是要在ImageView中显示图片,直接调用
imageView.setImageBitmap(cameraBitmapImage)更高效,无需转换Uri。 - 保存Bitmap时可根据需求选择压缩格式(PNG无损失、JPG可调整压缩质量)和质量参数。
- Android 10以下版本使用外部存储时,需申请
WRITE_EXTERNAL_STORAGE权限。
内容的提问来源于stack exchange,提问作者Abhimanyu Sharma
相关产品推荐
相关产品推荐

