Android - 使用 Intent 打开音频内容 uri

Ash*_*shy 0 audio android android-intent storage-access-framework

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

\n\n

如果我使用 Astro 文件管理器选择歌曲,则效果很好,但如果我通过 google Drive、音频部分或下载部分选择文件,则该歌曲将无法播放。

\n\n

我正在选择具有如下意图的文件:

\n\n
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\nintent.setType("audio/*");\nintent = Intent.createChooser(intent, "Select audio or music");\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
Intent intent = new Intent(Intent.ACTION_VIEW, uri);\ncontext.startActivity(intent);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

如何打开 Google Drive 使用该媒体类型的默认应用程序返回的内容 Uri?

\n\n

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

\n\n
Intent intent = new Intent(Intent.ACTION_VIEW, audio.getAudioUri());\nintent.setType("audio/*");\ncontentController.startActivity(intent);\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我执行此操作时,它会使用 VLC 媒体播放器打开,并且 VLC 报告错误“VLC 遇到此媒体错误。请尝试刷新媒体库。”

\n\n

编辑2:即使我强制选择器,它总是用VLC打开:

\n\n
Intent intent = new Intent(Intent.ACTION_VIEW, uri);\nintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\nintent.setType("audio/*");\nIntent chooser = Intent.createChooser(intent, "Play the song with");\n//contentController.startActivity(intent);\ncontentController.startActivity(chooser);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我什至尝试过“设置”->“应用程序”->“重置应用程序首选项”,但它仍然始终默认为 VLC。这是在运行 Android 5.1 的 Nexus 5 上进行的。

\n\n

编辑 3:Logcat 错误\n我在 logcat 窗口中看到这些错误:

\n\n
04-14 09:26:27.869  29143-29143/com.my.app E/Audio\xef\xb9\x95 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\n04-14 09:26:27.871  29143-29143/com.my.app E/Audio\xef\xb9\x95 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

在应用程序的 AndroidManifest.xml 中,我确实指定了:

\n\n
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

cke*_*tti 5

媒体播放器需要访问(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);
Run Code Online (Sandbox Code Playgroud)