11

据我所知,只有三种方法可以通过阅读现有问题来获取 MIME 类型。

1)使用文件扩展名确定它MimeTypeMap.getFileExtensionFromUrl

2)“猜测”使用inputStreamwithURLConnection.guessContentTypeFromStream

3) 使用ContentResolvercontent Uri (content:\) 获取 MIME 类型context.getContentResolver().getType

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

4

3 回答 3

18

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

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.decodeFile或者BitmapFactory.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。

于 2013-11-02T06:14:34.213 回答
9

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

不仅仅来自文件名。

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

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

如果你content:// Uri使用getType()on aContentResolver来获取 MIME 类型。

于 2013-09-06T20:00:08.070 回答
3

First bytes contains file extension

@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;
}
于 2016-12-05T16:20:32.000 回答