在Android中,如何根据文件类型显示应用程序选择器?

时间:2011-01-29 00:50:48

标签: android

如果已经回答道歉 - 如果有人能指出我已回答的问题,那就太棒了......

很简单,我希望能够弹出一个可以处理给定类型文件的应用程序列表 - 例如,如果我有一个音乐文件(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类型,小写,但我不确定在这个实例中使用什么...

请温柔:)

2 个答案:

答案 0 :(得分:8)

要获得可以成功打开给定intent的应用程序,您将使用PackageManager。只需构建上述intent,然后使用此代码获取可以处理intent的应用程序。

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);

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

答案 1 :(得分:1)

我假设你想看看这个选择器对话框,如果你打开一个文件(或URL)并且注册了多个应用程序来处理它?例如。你打开一个youtube网址,可以选择使用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);

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

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