【问题标题】:Right mimeType for opening file用于打开文件的正确 mimeType
【发布时间】:2011-05-21 22:18:51
【问题描述】:

我正在尝试用Intent 打开File,但Android 没有为该文件类型打开正确的应用程序。

使用以下代码,使用音乐应用程序打开每个文件 - pdf、图像、所有内容:

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

当我手动指定 mimeType 时,会打开正确的应用程序 - 在本例中是图片查看器。

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

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

【问题讨论】:

    标签: android file android-intent mime-types


    【解决方案1】:

    你可以这样做:

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

    这是我的助手类的(相关部分)从文件中获取 mimeType

    关键是使用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());
        }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 完美运行。谢谢。我想知道为什么 SO 版主无权将回复标记为答案? MSDN Q/A 网站有这个不错的功能。
    • 我只是注意到这有时不起作用,例如 png 图像。从好的方面来说,我发现以下链接中的第二种方法适用于我尝试过的所有文件类型。 helloworldcodes.blogspot.com/2011/10/…
    • 不能与 png 一起使用,真的吗?在我这边,它正在工作。感谢您提供附加链接:-)
    • 这很奇怪。我打开时图像是空白的。另外,当我使用它打开 .txt 文件时,它无法打开文件说“文件打开错误。文件打开时出错。”
    • 我用 Gallery 应用程序检查了这个(用 Gallery 应用程序打开 png),它只是打开了我的库。不打开文件。 :|
    【解决方案2】:

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

    【讨论】:

    • 但是为什么 Android 不能自己确定正确的类型呢?意图引用状态为“指定意图数据的显式类型(MIME 类型)。通常类型是从数据本身推断出来的。通过设置此属性,您可以禁用该评估并强制使用显式类型。”这对我的代码根本不起作用,所以它一定是一个错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多