【问题标题】:In Android, How can I display an application selector based on file type?在 Android 中,如何根据文件类型显示应用程序选择器?
【发布时间】:2015-06-03 11:13:25
【问题描述】:

如果这个问题已经得到解答,我们深表歉意——如果有人能指出一个已经得到解答的问题,那就太好了……

非常简单,我希望能够弹出一个可以处理给定类型文件的应用程序列表 - 例如,如果我有一个音乐文件(mp3、ogg 等),我想能够显示可以处理文件并允许用户选择的所有已加载媒体应用程序的列表。

我一直在尝试创建一个这样做的意图,如下所示:

Intent myIntent = new Intent();
myIntent.setAction(Intent.ACTION_VIEW);
myIntent.addCategory("android.intent.category.LAUNCHER");
myIntent.setType("mp3");
startActivity(myIntent);

但我显然弄错了,因为它每次都会崩溃。我应该使用 ACTION_PICK 还是 ACTION_CHOOSER 而不是 ACTION_VIEW?

更重要的是,是否可以通过 Intent.type 以外的方式轻松定义所有媒体播放器?我认为 type 应该是正确的 MIME 类型,小写,但我不确定在这种情况下使用什么...

请温柔:)

【问题讨论】:

  • ping 这个看看是否有人有答案(甚至是部分答案)...
  • 我遇到了类似的问题。我使用以下解决方案来获取应用程序选择器:stackoverflow.com/questions/7635764/… 此解决方案还消除了构建您自己的对话框的需要。

标签: android


【解决方案1】:

要获得可以成功打开给定 Intent 的应用程序,您将使用 PackageManager。只需像上面那样构造意图,然后使用此代码来获取可以处理意图的应用程序。

Intent myIntent = new Intent();
myIntent.setAction(Intent.ACTION_VIEW);
myIntent.addCategory("android.intent.category.LAUNCHER");
myIntent.setType("mp3");    

PackageManager manager = getPackageManager();
List<ResolveInfo> info = manager.queryIntentActivities(
    myIntent, PackageManager.MATCH_DEFAULT_ONLY);

这将为您提供有关可以处理意图的程序的所有信息,包括图标和包名。然后,您可以使用这些选项创建一个对话框并保存用户选择的选项。

【讨论】:

  • “上述意图”是指@sstn 的代码吗?在这种情况下,您的意思是使用您的包管理器代码而不是 startActivity()?
  • 正确。然后,这将为您提供所需的所有信息。让我清理一下代码。
  • 看起来很棒!我不认为你有任何合适的对话框的代码,是吗?还是我只是创建自己的“标准”?
  • 您只需创建自己的标准。我会选择一个警报对话框。检查这个developer.android.com/guide/topics/ui/dialogs.html#AddingAList
【解决方案2】:

如果您确实打开了一个文件(或 URL)并且注册了多个应用程序来处理它,我假设您希望看到此选择器对话框?例如。您打开一个 youtube URL 并可以选择使用 youtube 播放器或浏览器?

当我想(通过文件浏览器)打开图像时,系统发送的意图是这样的:

File f = new File("/sdcard/IMG_0114.JPG");
Uri uri = Uri.fromFile(f);

Intent i = new Intent(Intent.ACTION_VIEW);
// use setDataAndType() - setData() and setType() cancel each other
i.setDataAndType(uri, "image/jpeg");
i.putExtra("preview", false);
i.putExtra("key_filename", "/sdcard/IMG_0114.JPG");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.putExtra("sort_order", 0);

// It's one of the flag combinations:
i.setFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
        Intent.FLAG_ACTIVITY_SINGLE_TOP |
        Intent.FLAG_ACTIVITY_MULTIPLE_TASK |
        Intent.FLAG_DEBUG_LOG_RESOLUTION);

startActivity(i);

编辑:更正代码以获得有效的(最小)解决方案。

我不确定必须设置额外数据的哪些字段 - 没有找到相关文档。

【讨论】:

  • 你说得对,我想看到选择器对话框。但是,我实际上并不想打开该文件(实际上,我实际上并不想拥有一个特定的文件)——我希望能够返回用于打开该文件的方法。
  • 基本上,我想弹出一个文件type的选择器,然后能够保存(在我的应用程序中)所选应用程序的名称。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多