Android Q RecoverableSecurityException не предоставляет доступ - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь отсортировать обработку файлов для Android API 29. Поскольку я ничего не имею в отношении файлов на Android, я столкнулся с проблемой.

Когда я добавляю изображения в свое приложение, я могу удалить их, используя contentResolver.delete(deleteUri, null, null);, и все работает отлично. Но когда приложение удаляется, а затем переустанавливается, оно дает мне RecoverableSecurityException, это учитывается, и я сделал так, чтобы у файла запрашивалось разрешение на его удаление. Когда разрешение предоставлено, и я пытаюсь удалить файл снова, он все равно дает мне android.app.RecoverableSecurityException: **app**.debug has no access to content://media/external/images/media/280. Он удален из ContentResolver, так как он больше не виден ни в одной из галерей и не возвращает результата при запросе, но файл все еще «физически» на устройстве.

Куда мне нужно обратиться исправить эту проблему? У ContentResolver есть только один результат, путь к файлу, который он показывает в другой ошибке (показан вместе с вышеуказанной ошибкой), является правильным: E/MediaProvider: Couldn't delete /storage/emulated/0/Pictures/**app**/**filename**.jpeg

Функция удаления файла:

Cursor c = getCursorFromContentResolver(fileName);

        if (c != null && c.moveToFirst())
        {
            long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
            Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
            try
            {
                contentResolver.delete(deleteUri, null, null);
            }catch (RecoverableSecurityException e)
            {
                //After the below Intent returns, the current function is run again
                activity.startIntentSenderForResult(e.getUserAction().getActionIntent().getIntentSender(), requestCode, null, 0, 0, 0, null);
            }
            c.close();
            return true;
        }

Требуются другие разрешения:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1 Ответ

0 голосов
/ 09 марта 2020

Я столкнулся с очень похожей проблемой в Android Q при удалении изображения с помощью вызова удаления Content resolver. Оказалось, что, несмотря на то, что я ловил RecoverableSecurityException для разрешения удалить изображение из галереи android, он по-прежнему выдает ошибку, что не может удалить файл, потому что приложение не имеет разрешения (таким образом, после открытия Google Photos оно будет отсканируйте изображения и найдите «восстановленный», заставляющий его вернуться). Здесь я увидел ту же ошибку, что и в вашем вопросе. Когда я попробовал тот же код на Android R файл не вернулся.

После прочтения этого вопроса я попытался использовать SAF в качестве решения. Мне удалось удалить изображение навсегда, чтобы пользователь выбрал каталог изображений (в моем случае DCIM / Camera), используя Intent.ACTION_OPEN_DOCUMENT_TREE

Затем я захватил Uri родительской папки и имя файла в этой папке, когда была нажата кнопка удаления:

 String filename = queryUriName(content, photoUri);

 DocumentFile docF = DocumentFile.fromTreeUri(context,myTree);
 Boolean docex = docF.exists();
 String idDoc = DocumentsContract.getTreeDocumentId(myTree);
 idDoc = idDoc + "/"+filename;
 Uri childrenUri = DocumentsContract.buildDocumentUriUsingTree(myTree,idDoc);

 DocumentFile childfile = DocumentFile.fromSingleUri(context,childrenUri);
 Boolean chex = childfile.exists();
 System.out.println("child exist: "+ chex+ " file name is " + filename +"   "+idDoc);

Это позволило удалить фактический файл, и из того, что я могу сказать, не выдает никаких ошибок, и файл исчез.

Примите это с осторожностью, так как я ~ 3 недели в android dev и не смог найти ни описанную проблему, ни решение в другом месте. Но был бы рад расширить или обновить ответ, если это необходимо.

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