Android - 从没有扩展名的文件中获取MIME类型

时间:2013-09-06 19:54:05

标签: java android file mime-types

据我所知,只有三种方法可以让MIME类型阅读现有问题。

1)使用MimeTypeMap.getFileExtensionFromUrl

从文件扩展名中确定它

2)使用inputStreamURLConnection.guessContentTypeFromStream

“猜猜”

3)使用ContentResolver使用内容Uri获取MIME类型(内容:\)context.getContentResolver().getType

但是,我只有文件对象,可获取的Uri是文件路径Uri(文件:)。该文件没有扩展名。还有办法获取文件的MIME类型吗?或者从文件路径Uri确定内容Uri的方法?

3 个答案:

答案 0 :(得分:12)

你试过这个吗?它适用于我(仅适用于图像文件)。

public static String getMimeTypeOfUri(Context context, Uri uri) {
    BitmapFactory.Options opt = new BitmapFactory.Options();
    /* The doc says that if inJustDecodeBounds set to true, the decoder
     * will return null (no bitmap), but the out... fields will still be
     * set, allowing the caller to query the bitmap without having to
     * allocate the memory for its pixels. */
    opt.inJustDecodeBounds = true;

    InputStream istream = context.getContentResolver().openInputStream(uri);
    BitmapFactory.decodeStream(istream, null, opt);
    istream.close();

    return opt.outMimeType;
}

当然,您也可以使用其他方法,例如BitmapFactory.decodeFileBitmapFactory.decodeResource

public static String getMimeTypeOfFile(String pathName) {
    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(pathName, opt);
    return opt.outMimeType;
}

如果无法确定MIME类型,它将返回null。

答案 1 :(得分:4)

  

还有办法获取文件的MIME类型吗?

不仅仅来自文件名。

  

或者从文件路径Uri确定内容Uri的方法?

没有任何“内容Uri”。欢迎您尝试在MediaStore中查找该文件,并查看是否由于某种原因知道了MIME类型。 MediaStore可能知道也可能不知道MIME类型,如果不知道,则无法确定它。

如果您 拥有content:// Uri,请在getType()上使用ContentResolver来获取MIME类型。

答案 2 :(得分:2)

第一个字节包含文件扩展名

@Nullable
public static String getFileExtFromBytes(File f) {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(f);
        byte[] buf = new byte[5]; //max ext size + 1
        fis.read(buf, 0, buf.length);
        StringBuilder builder = new StringBuilder(buf.length);
        for (int i=1;i<buf.length && buf[i] != '\r' && buf[i] != '\n';i++) {
            builder.append((char)buf[i]);
        }
        return builder.toString().toLowerCase();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}