Android - открыть аудио контент URI с намерением

У меня есть приложение, которое позволяет пользователям составлять список песен, которые они выбирают на своем устройстве. Затем они могут выбрать песню для воспроизведения, и приложение откроет URI песни с намерением, так что музыкальный проигрыватель по умолчанию используется для фактического воспроизведения песни.

Это работает нормально, если я выбираю песню с помощью файлового менеджера Astro, но если я выберу файл через google Drive, раздел Audio или раздел Downloads, песня не будет воспроизводиться.

Я выбираю файлы с намерением примерно так:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*");
intent = Intent.createChooser(intent, "Select audio or music");

А затем получить Ури с data.getData(),

Чтобы позже открыть Uri Im, используя намерение, подобное:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent);

Астро файловый менеджер возвращает Uris в виде file:///storage/sdcard0/Download/My%20Song.mp3 и эти открываются и хорошо играют с приложением по умолчанию медиа.

Google Drive возвращает Uris в форме content://com.google.android.apps.docs.storage/document/acc%3D1%3Bdoc%3D421, Когда я пытаюсь открыть Uris таким образом с помощью Intent с помощью стандартного мультимедийного приложения, появляется всплывающее окно "Не удалось воспроизвести трек, который вы запросили".

Как открыть контент Uri, который Google Drive возвращает с приложением по умолчанию для этого типа мультимедиа?

Изменить: Я также попытался явно установить тип MIME при открытии URI с помощью Intent:

Intent intent = new Intent(Intent.ACTION_VIEW, audio.getAudioUri());
intent.setType("audio/*");
contentController.startActivity(intent);

Когда я делаю это, он открывается с помощью медиаплеера VLC, и VLC сообщает об ошибке "VLC обнаружил ошибку на этом носителе. Попробуйте обновить библиотеку мультимедиа".

РЕДАКТИРОВАТЬ 2: Это всегда открывается с VLC, хотя я заставляю выбора:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("audio/*");
Intent chooser = Intent.createChooser(intent, "Play the song with");
//contentController.startActivity(intent);
contentController.startActivity(chooser);

Я даже пытался Настройки-> Приложения-> Сбросить настройки приложения, и он по-прежнему всегда по умолчанию VLC. Это на Nexus 5 под управлением Android 5.1.

Редактировать 3: Ошибки LogCat Я вижу эти ошибки в окне LogCat:

04-14 09:26:27.869  29143-29143/com.my.app E/Audio﹕ Permission Denial: opening provider com.google.android.apps.docs.storagebackend.StorageBackendContentProvider from ProcessRecord{2f0a6a28 29143:com.my.app/u0a80} (pid=29143, uid=10080) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
04-14 09:26:27.871  29143-29143/com.my.app E/Audio﹕ Permission Denial: opening provider com.google.android.apps.docs.storagebackend.StorageBackendContentProvider from ProcessRecord{2f0a6a28 29143:com.my.app/u0a80} (pid=29143, uid=10080) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

В AndroidManifest.xml приложения, которое у меня есть, указано:

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

Редактировать 4: Ну, это, кажется, зависит от устройства. Все вышеописанное тестирование было проведено на Nexus 5. Я только что протестировал на своем Nexus 7 (Android 5.0.2) и открывал URI контента с помощью прямого намерения, а не селектор работает без ошибок.

1 ответ

Медиаплеер должен иметь разрешение для доступа к поставщику контента (Google Drive). Добавьте флаг FLAG_GRANT_READ_URI_PERMISSION с целью намерения.

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);
Другие вопросы по тегам