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

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:

  1. 在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>
  1. 在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>
  1. 转换方法实现:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:16:22