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);