启动文件和MIMEtypes的意图?

我在这里回顾了所有类似的问题,但我不能为了我的生活找出我做错了什么。

我写了一个应用程序,试图启动各种文件,sorting文件浏览器。 单击某个文件时,会尝试根据其关联的MIMEtypes启动该程序,或者显示“select要启动的应用程序”对话框。

这里是我用来启动的代码:

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文件pipe理器的例子,它会打开,而不是引发这个错误,然后如果我从内部点击相同的文件,它会启动相应的对话框。

我注意到,该特定文件的MIMEtypes失败,但其他MIMEtypes,如.zip做返回值。

我是否错过了当MIMEtypes为空时调用允许用户select的对话框?

我试过启动应用程序的其他变种,包括不设置MIMEtypes,只使用.setData没有成功。

我想要做的动作是,用户点击一个文件,如果它与应用程序启动的应用程序相关联,如果没有,则用户获得具有应用程序列表的“完成操作使用”对话框。

感谢您的任何build议。

Related of "启动文件和MIMEtypes的意图?"

非常感谢开放意向的人,我第一次通过他们的文件pipe理器中的代码错过了答案,这是我最后的结果:

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

如果在无法从系统中确定(如果为null )的情况下使用MIMEtypes的"* / *" ,则会触发相应的select应用程序对话框。

您可以使用通用意图来打开文件,就像这里提供的代码片段:

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

但是我通常会看到,应用程序在嵌套if中检查文件的扩展名,最后尝试用“ text / plain ”types打开文件:

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

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