【问题标题】:How to get a list of installed media players如何获取已安装媒体播放器的列表
【发布时间】:2011-01-03 17:25:49
【问题描述】:

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

据我了解,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 类型。

【问题讨论】:

  • 第二段代码完全符合我在启动活动时的要求。它为我提供了手机上可以处理意图的应用程序列表。我只是找不到自己生成该列表的方法,因此我可以操纵事物。我不想开始活动,只需获取操作系统用于生成该列表的任何数据。
  • 好的,我想我有这个工作。当我得到它时,我会发布解决方案。
  • 这也可能对你有用:stackoverflow.com/questions/18161237/…

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


【解决方案1】:

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

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 可能没有任何音频。我在重新启动后立即尝试了此代码,它可以工作。我没有在没有安装用户媒体的手机上尝试过。

【讨论】:

  • 我已经尝试过你的代码,它正在获取媒体播放器,是否有任何代码可以访问设备中存储的音频和视频文件列表。
  • @Bob: 这给了我W/ContentResolver: Failed to get type for: content://media/external/audio/media/1 (Unknown URL : content://media/external/audio/media/1) 执行时的错误...是否需要任何权限才能在 AndroidManifest.xml 中添加?
【解决方案2】:

/* 对于我运行 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】:
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”。

【讨论】:

    【解决方案4】:
    /** 
         * get apps supporting video playing
         * @return 
         */  
        private List<String> queryPlayerPackageNameLst()  
        {         
            Intent intent = new Intent(Intent.ACTION_VIEW);  
            intent.setDataAndType(Uri.parse(video), "video/*");  
    
            PackageManager pm = getPackageManager();  
    
            List<ResolveInfo> infos = pm.queryIntentActivities(intent,PackageManager.MATCH_UNINSTALLED_PACKAGES);  
    
            List<String> packageNameLst = null;  
    
            if (infos != null && infos.size() > 0)  
            {  
                packageNameLst = new ArrayList<String>(infos.size());  
    
                for(int i=0; i<infos.size(); i++)  
                {  
                    ResolveInfo info = infos.get(i);  
    
                    packageNameLst.add(info.activityInfo.packageName);  
                    //info.activityInfo.name  
                }  
            }  
    
            return packageNameLst;  
        }  
    

    【讨论】:

      【解决方案5】:
      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);
      

      我觉得这样更好!

      【讨论】:

      • 最好说明您为什么认为这样更好。
      【解决方案6】:

      对于运行 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(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多