Android - 用Intent打开音频内容uri

时间:2015-04-14 00:52:40

标签: android audio android-intent storage-access-framework

我有一个应用程序,可让用户列出他们从设备中选择的歌曲。然后他们可以选择要播放的歌曲,应用程序将使用Intent打开歌曲的uri,以便使用默认音乐播放器来实际播放歌曲。

如果我选择使用Astro文件管理器的歌曲,但是如果我通过谷歌驱动器,音频部分或下载部分选择一个文件,那么该歌曲将无法播放。

我正在选择带有Intent的文件,如下所示:

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

然后使用data.getData()检索Uri。

稍后使用以下意图打开Uri Im:

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

Astro文件管理器以file:///storage/sdcard0/Download/My%20Song.mp3的形式返回Uris,并打开这些Uris并使用默认媒体应用程序正常播放。

Google云端硬盘以content://com.google.android.apps.docs.storage/document/acc%3D1%3Bdoc%3D421的形式返回Uris。 当我尝试使用默认媒体应用程序使用Intent打开Uris时,会显示弹出窗口“无法播放您请求的曲目”。

如何使用该媒体类型的默认应用打开Goog​​le云端硬盘返回的内容Uri?

编辑:在使用Intent打开uri时,我也尝试显式设置mime类型:

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。这是在运行Android 5.1的Nexus 5上。

编辑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

在app的AndroidManifest.xml中我确实指定了:

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

编辑4 : 那么这似乎是特定于设备的。上面的所有测试都是在Nexus 5上完成的。我刚刚在我的Nexus 7(Android 5.0.2)上测试并使用直接Intent打开内容uri,而不是选择器没有错误。

1 个答案:

答案 0 :(得分:3)

媒体播放器需要获得访问(Google云端硬盘)内容提供商的权限。将标记FLAG_GRANT_READ_URI_PERMISSION添加到视图意图。

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