Есть ли только временное разрешение для файлов, к которым предоставлен общий доступ через приложение «Загрузки» по умолчанию?

Я пытаюсь воспроизвести аудиофайл после того, как пользователь выбрал/поделился аудиофайлом в каком-либо файловом браузере. Для этого я использую фильтр, через который я получаю Uri аудиофайла. На основе Ури я могу играть. Uri используется MediaPlayer для открытия FileDescriptor.

Я храню Uri, чтобы использовать его после перезапуска приложения. Он работает со всеми файловыми браузерами, кроме приложения Android по умолчанию для загрузки. Если я открываю файл из приложения «Загрузки», я получаю Uri следующим образом:

content://com.android.providers.downloads.documents/document/25 - on android 7

Я могу играть. Но после перезапуска приложения я больше не могу играть в тот же uri. Я получаю исключение:

    java.lang.SecurityException: Permission Denial: 
opening provider com.android.providers.downloads.DownloadStorageProvider from 
ProcessRecord{160760b 3618:com.sample/u0a71} (pid=3618, uid=10071) 
requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

из документов об этом разрешении:

Это разрешение должно запрашиваться только приложением управления документами платформы. Это разрешение не может быть предоставлено сторонним приложениям.

Означает ли это, что приложение имеет только временное разрешение на файл? Есть ли какое-нибудь решение для этого?


person Martin Vandzura    schedule 15.02.2017    source источник


Ответы (1)


Итак, я понял, что приложение-отправитель устанавливает только временное разрешение, используя эти флаги FLAG_GRANT_WRITE_URI_PERMISSION и FLAG_GRANT_READ_URI_PERMISSION. Разрешение действительно только до тех пор, пока активно действие, обрабатывающее намерение. Так что, по крайней мере, чтобы обнаружить это, я использую

if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION) == Intent.FLAG_GRANT_READ_URI_PERMISSION || (flags & Intent.FLAG_GRANT_WRTITE_URI_PERMISSION) == Intent.FLAG_GRANT_WRITE_URI_PERMISSION) {
//only temporary permission
}
person Martin Vandzura    schedule 16.02.2017
comment
Я не знал, что разрешение действительно только до тех пор, пока активна активность, обрабатывающая намерение. Пытался перенаправить намерение на другое действие, которое не удалось, и не мог понять, почему. - person Miloš Černilovský; 25.09.2018