Android MediaPlayer: доступ к файлам в Android Q и выше - PullRequest
2 голосов
/ 13 января 2020

Я пишу приложение для медиаплеера, которое я хочу перенести в Android В. Я использую MediaStore для запроса аудиофайлов и сохранения исполнителя, альбома, пути и т. Д. c. в моей базе данных SQLight. Если я хочу воспроизвести аудиофайл, я извлекаю путь из базы данных (запрос SQL) и задаю его как mediaplayer.setDatasource (путь). Пытаясь это, я получаю сообщение об ошибке «Ошибка открытия: EACCES (Permission Denied)».

Пользователь может выбрать каталог, в котором хранятся аудиофайлы, с помощью filechooser.

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |  Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
 startActivityForResult(Intent.createChooser(intent, "Choose directory"), PICK_AUDIO_REQUEST);

In onActivityResult Я установил разрешения для выбранного каталога, например

     Uri uri = data.getData();
     int takeFlags = data.getFlags();
     takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION |Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);

Когда я пытаюсь использовать путь в медиаплеере mMediaPlayer.setDataSource(path);

Я получил следующую ошибку:

 open failed: EACCES (Permission denied)

Использование android:requestLegacyExternalStorage="true" не является решением, которое я хочу реализовать.

В манифесте. xml Я установил разрешения:

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

Пожалуйста, помогите.

Спасибо, GGK

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Решено с помощью

childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(mUri,
            DocumentsContract.getTreeDocumentId(mUri));
cur = getContentResolver().query(childrenUri, null, null, null, null);

Спасибо @CommonsWare за поддержку меня

0 голосов
/ 13 января 2020

вам нужно добавить

android: requestLegacyExternalStorage = "true"

в файле androidManifest, который помогает в доступе к файлу из Q.

...