20

我已经在这里查看了所有类似的问题,但我一生都无法弄清楚我做错了什么。

我编写了一个尝试启动各种文件的应用程序,类似于文件浏览器。单击文件时,它会尝试根据其关联的 MIME 类型启动程序,或者显示“选择要启动的应用程序”对话框。

这是我用来启动的代码:

    File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position));

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    myIntent.setDataAndType(Uri.fromFile(file),mimetype);
    startActivity(myIntent);

这失败并生成错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes }

现在,例如,如果我安装 OI 文件管理器,它会打开而不是引发此错误,然后如果我从其中单击同一文件,它会启动相应的对话框。

我注意到该特定文件的 MIME 类型失败,但其他 mime 类型如.zip返回值。

当 MIME 类型为 null 以调用允许用户选择的对话框时,我是否遗漏了一些东西?

我尝试了启动应用程序的其他变体,包括不设置 MIME 类型并且仅使用.setData但没有成功。

我想要发生的操作是,用户单击文件,如果它与应用程序启动的应用程序相关联,如果没有,用户将获得带有应用程序列表的“使用完成操作”对话框。

感谢您的任何建议。

4

2 回答 2

48

好吧,感谢 Open Intent 的家伙,我第一次通过他们的文件管理器中的代码错过了答案,这就是我最终得到的结果:

    File file = new File(filePath);
    MimeTypeMap map = MimeTypeMap.getSingleton();
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
    String type = map.getMimeTypeFromExtension(ext);

    if (type == null)
        type = "*/*";

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri data = Uri.fromFile(file);

    intent.setDataAndType(data, type);

    startActivity(intent);

如果您使用"* / *"无法从系统中确定它的 mime 类型(它是null),它会触发相应的选择应用程序对话框。

于 2012-06-18T18:39:36.827 回答
1

您可以使用通用意图打开文件,例如此处提出的此代码段:

private void openFile(File aFile){
    try {
        Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION,
        new ContentURI("file://" + aFile.getAbsolutePath()));
        startActivity(myIntent);
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}     

但我通常会看到 Applications 在嵌套的 if 中检查文件的扩展名,最后尝试使用“ text/plain ”类型打开文件:

Intent generic = new Intent();
generic.setAction(android.content.Intent.ACTION_VIEW);
generic.setDataAndType(Uri.fromFile(file), "text/plain");     
try {
    startActivity(generic);
    } catch(ActivityNotFoundException e) {
    ...
}     

您可以在这个问题或这个开源项目中看到完整的代码。我希望这对你有帮助。

于 2012-06-17T05:25:06.870 回答