android - 如何获取已安装媒体播放器的列表

标签 android audio android-intent media media-player

在我的应用程序中,我有一个菜单项,我想打开用户首选的媒体播放器,只对音频感兴趣。理想情况下,用户第一次选择此项目时,如果他们只安装了一个,它将选择手机上唯一的媒体播放器,或者如果他们有多个,则向他们显示一个列表。然后我会保存他们的选择,这样下次它会打开那个。

据我了解,Android 没有默认的媒体播放器。我有原始的 Droid,它有一个媒体播放器,但我知道其他运营商使用他们自己的,或者用户可以卸载标准的。

我已经尝试了一些东西,但无法使任何东西起作用。

我试过这段代码,它应该得到一个支持 Intent 的包列表。它适用于“application/pdf”和“video/*”之类的东西。当我用“audio/*”尝试时,我得到一个空列表,即使我同时安装了标准的 Android 媒体播放器和 MixZing。也尝试过使用“media/*”但什么也得不到。

PackageManager packageManager = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("audio/*");
List list = packageManager.queryIntentActivities(testIntent, 0);

我已经看到这段代码可以使用默认播放器打开音频文件,但是我不想打开文件,我只想打开音频应用程序,就像用户从应用程序抽屉中打开它一样.

Intent i = new Intent(Intent.ACTION_VIEW);
Uri u = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
i.setData(u); 
startActivity(i); 

我唯一能想到的另一件事就是出去获取最流行的媒体播放器的包名称并将它们硬编码并搜索手机以查看安装了哪些,但这似乎不像最好的方法。我不明白为什么第一段代码不起作用。也许没有为这些应用正确设置 Intent 过滤器,或者我使用了错误的代码或 MIME 类型。

最佳答案

好的,这就是我向操作系统询问已安装音频播放器列表的方式。

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
intent.setData(uri);
List<ResolveInfo> playerList;
playerList = packageManager.queryIntentActivities(intent, 0);

playerList 将由手机上声称处理音频的每个应用程序的 ResolveInfo 对象填充。从 ResolveInfo 中,您可以获得诸如包名之类的信息来启动 Activity ,您可以获得图标和应用程序名称。我用它来填充一个自定义对话框,该对话框的外观和行为类似于用于选择要启动的 Activity 的标准 Android 对话框。我还可以让用户将所选应用设置为默认应用。

这并不完美。您受制于操作系统和应用程序的 intent 过滤器。我已经用几部手机试过这个,以下应用程序正确显示:原始 Droid 的库存媒体播放器、HTC 手机的库存媒体播放器、doubleTwist 和 MixZing。但是,我安装了 Zimly,但它没有显示。我怀疑他们的 Intent 过滤器没有为音频设置。

我还担心 MediaStore.Audio.Media.INTERNAL_CONTENT_URI 可能没有任何音频。我在重新启动后立即尝试了此代码并且它有效。我没有在没有安装用户媒体的手机上尝试过。

关于android - 如何获取已安装媒体播放器的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4586684/

相关文章:

android - 复选框和复选框文本不在同一行android

iphone - 在iOS中使用控件播放音频

android - 在用户同意的情况下在 Android 中禁用蓝牙

android - 以编程方式从android中的 Assets 文件夹安装apk

安卓时区困惑

android - 默认加载一些数据到我们的数据库 sqlite

java - 如何根据索引而不是键从 LinkedHashMap 获取值?

javascript - 如何使用网络音频 API 播放声音文件 Safari?

javascript - 正则表达式以匹配音频文件

android - 使用 onActivityResult 将数据从一个应用程序传递到另一个应用程序