2010-12-07 44 views
4

我试图用Intent打开File,但Android并未打开正确的文件类型应用程序。右mimeType用于打开文件

使用下面的代码,每一个文件 - PDF,图片,一切 - 打开与音乐应用程序:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.fromFile(file)); 
startActivity(i); 

当我手动指定mime类型,正确的应用程序打开 - 在这种情况下,图片查看器。

i.setDataAndType(Uri.fromFile(file), "image/*"); 

有什么办法让Android打开正确的应用程序,而不是从文件的扩展名手动设置类型?

回答

1

这取决于其他应用程序。如果他们已经设置了他们的意图过滤器,包括哑剧信息,文件扩展名信息或两者。所以,我的建议是你不能依赖于其他应用程序,所以最好的选择是在你启动一个intent时提供尽可能多的信息,包括MIME类型。

+1

但是,为什么Android不能自行确定正确的类型?意图引用声明类型为“指定意图数据的显式类型(MIME类型)”,通常该类型是从数据本身推断的,通过设置此属性,可以禁用该评估并强制显式类型。这对我的代码完全不起作用,所以它必须是错误的? – Gubbel 2010-12-08 15:24:01

1

你可以做这样的事情:

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.fromFile(file)); 
intent.setType(FileHelper.getMimeType(file)); 
startActivity(intent); 

这里是(相关部分)我的助手类从文件获得mime类型。

的关键是使用MimeTypeMap

public class FileHelper 
{ 

    public static String getMimeType(File file) 
    { 
     return getMimeType(file.getName()); 
    } 

    public static String getMimeType(String fileName) 
    { 
     String extension = getExtension(fileName); 
     if (extension == null) 
      return null; 
     return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    } 

    public static String getExtension(File file) 
    { 
     return getExtension(file.getName()); 
    } 

    public static String getExtension(String fileName) 
    { 
     int extensionDelimiter = fileName.lastIndexOf("."); 
     if (extensionDelimiter == -1) 
      return null; 
     return fileName.substring(extensionDelimiter + 1, fileName.length()); 
    } 
} 

希望这有助于。

+0

完美地工作。谢谢。 我想知道为什么版主无权将回复标记为答案? MSDN Q/A网站有这个不错的功能。 – Sufian 2014-02-12 07:05:29