android - 如何在不使用 Media...insertImage(..) 方法的情况下将位图转换为 Uri?
问题描述
我正在尝试将位图转换为 uri,但我从各种 SO 线程获得的代码是:
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
使用这种方法有3个问题:
- 不推荐使用 insertImage 方法
- 该解决方案将位图保存到用户设备,从而增加了用户设备上不必要的存储空间。
- 这有时不适用于所有设备。
那么任何人都可以建议我任何其他适用于较新版本的解决方案吗?
解决方案
文档说:
此方法在 API 级别 29 中已弃用。应使用MediaColumns#IS_PENDING执行图像插入,它提供了对生命周期的更丰富的控制。
所以你可以使用
public Uri getImageUri(Context inContext, Bitmap inImage) throws IOException {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{
File file = new File(inContext.getFilesDir(),System.currentTimeMillis()+".jpeg");
if(!file.exists())
{
file.getParentFile().mkdirs();
file.createNewFile();
}
inImage.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file));
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName());
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, file.getPath());
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
return inContext.getContentResolver().insert(Uri.fromFile(file),contentValues);
}
else
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
}
注意:此代码未经测试让我知道它是否有效