Как повторно запросить разрешение URI после его отзыва? - PullRequest
0 голосов
/ 31 марта 2019

В моем приложении я открываю файлы из памяти телефона.У меня проблемы с сохранением разрешений URI (, а не с EXTERNAL_STORAGE один).

Сначала я открываю файл как:

Intent mediaIntent = new Intent();
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    mediaIntent.setAction(Intent.ACTION_GET_CONTENT);
} else {
    mediaIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    mediaIntent.addCategory(Intent.CATEGORY_OPENABLE);
}
mediaIntent.setType("audio/*");
startActivityForResult(mediaIntent, 1);

Я могучтобы получить разрешение URI и принять «постоянный» как:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && resultCode == Activity.RESULT_OK && data != null) {
        Uri uri = data.getData();
        int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getContentResolver().takePersistableUriPermission(uri, takeFlags);
        }
    }
}

Затем я сохраняю uri.toString() в SharedPreferences, чтобы впоследствии иметь возможность прочитать файл.Закрытие приложения или перезагрузка телефона работают нормально, и я все еще могу получить доступ к файлу.Однако, если я удаляю приложение через adb uninstall, а затем пытаюсь получить доступ к файлу впоследствии:

String[] proj = { OpenableColumns.DISPLAY_NAME };
getApplicationContext().getContentResolver().query(uri, proj, null, null, null);

, оказывается, что у меня больше нет доступа к URI (checkCallingUriPermission возвращает PackageManager.PERMISSION_DENIED).

Есть ли способ попросить ContentProvider повторно предоставить разрешения URI после того, как предыдущий перестал работать?

Вызов:

ContentResolver cr = getApplicationContext().getContentResolver();
cr.takePersistableUriPermission(uri, takeFlags);

дает мне

No persistable permission grants found for UID X and Uri Y

1 Ответ

3 голосов
/ 31 марта 2019

Есть ли способ попросить ContentProvider повторно предоставить разрешения URI после прекращения работы предыдущего?

Нет, кроме как снова пройти через ACTION_OPEN_DOCUMENT, как вы делали в первый раз.

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

Кроме того, поскольку Pawel намекает на , возникает вопрос, откуда ваше переустановленное приложение получает это Uri. В принципе, при сохранении документа Uri локально все в порядке (если вы получили постоянные разрешения), его передача с устройства (резервное копирование, ваш сервер и т. Д.) Может работать не так хорошо.

...