我试图确定存储在Android设备(实际上是我与模拟器一起使用的虚拟设备)上的文件的Mime/Media Type。我找到了推荐javax.activation.MimetypesFileTypeMap的资源Get the MIME Type from a File,但是当我运行以下代码时,我得到所有文件类型的application/octet-stream:

MimetypesFileTypeMap map = new MimetypesFileTypeMap();
File dir = Environment.getExternalStorageDirectory();
File[] files = dir.listFiles();
String mimeType;
for( int i = 0; i < files.length; ++i ) {
    if( files[i].isDirectory() == false ) {
        mimeType = map.getContentType(files[i]);
        if( mimeType.toLowerCase().equals("application/octet-stream") ) {
            Log.d("mytag",
                String.format( "Unable to determine the mime type of file %s.",
                files[i].getName()));
        }
    }
}

我已经使用具有以下扩展名的文件进行了测试:jpg,txt,doc,xslx和pdf,它们都返回相同的内容。我需要做些初始化 map 的事情吗?该库找不到Android上受支持的mime类型列表吗?有没有更好的方法来获取Android上文件的mime类型?

最佳答案

也有这个问题。根据Java Docs,MimetypesFileTypeMap进行搜索

  • 以编程方式将条目添加到MimetypesFileTypeMap实例。
  • 用户主目录中的.mime.types文件。
  • 文件/lib/mime.types
  • 名为META-INF/mime-types
  • 的文件或资源
  • 名为META-INF/mime-types.default的文件或资源(通常仅在activation.jar文件中找到)

  • 如果您的Mimetypes全部以“application/octet-stream”的形式出现,则意味着您没有上述任何文件存在(或它们存在但不完整),并且没有向MimetypesFileTypeMap实例添加任何条目。

    解决...

    MimetypesFileTypeMap mimetypes规范格式
    # comments start with hash marks
    # format is <mime type> <space separated file extensions>
    # for example, for an image mime type and a text mime type
    image png tif jpg jpeg bmp
    text  txt text rtf TXT
    # either place those lines within the files specified by 2-4 or
    
    MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();
    mtftp.addMimeTypes("image png tif jpg jpeg bmp")
    
    # and it's as easy as that!
    

    08-05 13:37