Я создаю приложение, которое позволит пользователю выбрать фотографию из галереи. Как только они нажимают на фотографию, я сохраняю uri в БД своей комнаты. Когда я пытаюсь вернуться и просмотреть фотографию в своем приложении, я получаю эту ошибку

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dayaramo.wearyourcloset/com.dayaramo.wearyourcloset.EditItem}: java.lang.SecurityException: No persistable permission grants found for UID 10492 and Uri content://com.android.externalstorage.documents/document/primary:DCIM/Camera/20200508_145429.jpg

Я знаю, что вы должны использовать takePersistableUriPermissions, но, похоже, это игнорируется.

Код для выбора и сохранения URI изображения из галереи

void imageChooser() {

        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);

    }
  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK)  {

                Uri selectedImageUri = data.getData();
                if (null != selectedImageUri) {
                    // update the preview image in the layout
                    pictureResult.setImageURI(selectedImageUri);
                }
            }
    }

Код для повторного просмотра фото

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
this.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
pictureResult.setImageURI(uri);

Лучше всего скопировать фотографию из общего хранилища во внутреннюю память приложения? Мне все равно, будет ли фотография перемещена или удалена, поэтому я просто хочу использовать URI вместо ее копирования.

1
olivia.dayaram 4 Фев 2022 в 00:27

2 ответа

Для Intent.ACTION_GET_CONTENT вы не можете получить постоянное разрешение.

Вместо этого используйте ACTION_OPEN_DOCUMENT.

Возьмите их в onActivityResult, как вам уже сказали.

1
blackapps 4 Фев 2022 в 01:19

Код для повторного просмотра фото

За исключением, возможно, последней строки, остальная часть этого фрагмента кода либо неверна, либо не используется.

Вместо этого вызовите takePersistableUriPermission() внутри onActivityResult(), чтобы сразу запросить постоянный доступ:

  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK)  {

                Uri selectedImageUri = data.getData();
                if (null != selectedImageUri) {
                    // update the preview image in the layout
                    pictureResult.setImageURI(selectedImageUri);
                    getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                }
            }
    }

Кроме того, запрашивайте разрешение на запись только в том случае, если вы собираетесь заменить изображение на этом Uri, и имейте в виду, что вы не всегда можете получить доступ на запись.

И, как отметили черные приложения, вам нужно переключиться с ACTION_GET_CONTENT на ACTION_OPEN_DOCUMENT.

0
CommonsWare 4 Фев 2022 в 01:25