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

时间:2011-01-03 17:25:49

标签: android audio android-intent media media-player

在我的应用程序中,我有一个菜单项,我想打开用户首选的媒体播放器,只对音频感兴趣。理想情况下,当用户第一次选择此项目时,如果他们只安装了一个,则会选择手机上唯一的媒体播放器,如果他们有多个,则为他们提供一个列表。然后,我会保留他们的选择,以便下次打开那个。

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

我尝试过一些东西但却无法正常工作。

我尝试了这个代码,它应该得到一个支持意图的软件包列表。它适用于“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类型。

6 个答案:

答案 0 :(得分:6)

好的就是我如何向操作系统询问已安装音频播放器的列表。

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中,您可以获取包名称以启动活动,您可以获取图标和应用程序名称。我用它来填充一个自定义对话框,该对话框的外观和行为类似于选择要启动的活动的股票Android对话框。我还可以选择让用户将所选应用设置为默认值。

这并不完美。您受操作系统和应用程序的intent过滤器的支配。我用几部手机尝试了这个并且以下应用程序正确显示:原始Droid的股票媒体播放器,HTC手机的股票媒体播放器,doubleTwist和MixZing。但是,我安装了Zimly并没有显示出来。我怀疑他们的意图过滤器没有设置音频。

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

答案 1 :(得分:3)

Intent resolveIntent = new Intent(Intent.ACTION_VIEW);
if (type.startsWith("audio/*")) {
    Uri uri = Uri.withAppendedPath(
            MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
    resolveIntent.setDataAndType(uri, type);
} else if (type.startsWith("video/*")) {
    Uri uri = Uri.withAppendedPath(
            MediaStore.Video.Media.INTERNAL_CONTENT_URI, "1");
    resolveIntent.setDataAndType(uri, type);
} else if (type.startsWith("application/pdf")) {
    resolveIntent.setType(type);
}

List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.GET_RESOLVED_FILTER);

这是我的解决方案,如果你想获得“video / ”或“audio / ”APP的列表,你应该使用“setDataAndType”;但是如果你想获得“text / *”或“pdf”APP的列表,你可以使用“setType”。

答案 2 :(得分:3)

/ * 对于运行Android 5.0版本的三星galaxy s4,上面没有任何解决方案可行但我找到了另一个解决方案。完美的工作。以下是可能需要帮助的人的代码。 * /

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*");
List activities = this.getPackageManager().queryIntentActivities(intent, 0);
List activities; activities = getPackageManager().queryIntentActivities(intent, 0); int count = activities.size(); String a = Integer.toString(count);

//set alert for executing the task
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
builder1.setMessage("Handle: " + a);
builder1.setCancelable(true);

AlertDialog alert11 = builder1.create();
alert11.show(); 

答案 3 :(得分:0)

Intent resolveIntent = new Intent(Intent.ACTION_VIEW);
resolveIntent.setDataAndType(Uri.parse("file://"), MIMEType);
List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.MATCH_DEFAULT_ONLY| PackageManager.GET_RESOLVED_FILTER);

我认为这样更好!

答案 4 :(得分:0)

对于运行Android 5.0版本的三星Galaxy S4,上述解决方案均无效,但我找到了另一种解决方案。完美的工作。 以下是可能需要帮助的人的代码。

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*");
    List<ResolveInfo> activities = this.getPackageManager().queryIntentActivities(intent, 0);
    // content://media/internal/audio/media
    //List<ResolveInfo> activities;
    activities = getPackageManager().queryIntentActivities(intent, 0);
    int count = activities.size();
    String a = Integer.toString(count);

    //set alert for executing the task
    AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
    builder1.setMessage("Handle: " + a);
    builder1.setCancelable(true);

    AlertDialog alert11 = builder1.create();
    alert11.show(); 

答案 5 :(得分:0)

public void showNavBar() {
        View view = getWindow().getDecorView();
        view.setSystemUiVisibility(View.VISIBLE);
}