В моем приложении я открываю файлы из памяти телефона.У меня проблемы с сохранением разрешений 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