首页 > 解决方案 > 如何在不使用 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个问题:

  1. 不推荐使用 insertImage 方法
  2. 该解决方案将位图保存到用户设备,从而增加了用户设备上不必要的存储空间。
  3. 这有时不适用于所有设备。

那么任何人都可以建议我任何其他适用于较新版本的解决方案吗?

标签: android

解决方案


文档说:

此方法在 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);
        }
    }

注意:此代码未经测试让我知道它是否有效


推荐阅读