据我所知,只有三种方法可以让MIME类型阅读现有问题。
1)使用MimeTypeMap.getFileExtensionFromUrl
2)使用inputStream
和URLConnection.guessContentTypeFromStream
3)使用ContentResolver
使用内容Uri获取MIME类型(内容:\)context.getContentResolver().getType
但是,我只有文件对象,可获取的Uri
是文件路径Uri
(文件:)。该文件没有扩展名。还有办法获取文件的MIME类型吗?或者从文件路径Uri确定内容Uri的方法?
答案 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.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。
答案 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;
}