Как преобразовать растровое изображение в Uri без использования метода Media ... insertImage (..)? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь преобразовать растровое изображение в 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. Иногда это работает не на всех устройствах.

Может ли кто-нибудь предложить мне другое решение, которое работает и с более новой версией?

1 Ответ

0 голосов
/ 28 мая 2020

документы говорят:

Этот метод устарел на уровне 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);
        }
    }

Примечание. Этот код не тестировался. Сообщите мне, сработал ли он

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...