Android – 从文件中获取MIMEtypes,不带扩展名

据我所知,只有三种方法可以让MIMEtypes读取现有的问题。

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

2)使用带有URLConnection.guessContentTypeFromStreaminputStream “猜测”

3)使用ContentResolver获取使用内容的MIMEtypesUri(con​​tent:\) context.getContentResolver().getType

但是,我只有文件对象,可获得的Uri是文件pathUri (文件:)。 该文件没有扩展名。 是否还有一种方法来获取该文件的MIMEtypes? 或者从文件pathUri中确定内容Uri的方法?

Solutions Collecting From Web of "Android – 从文件中获取MIMEtypes,不带扩展名"

是否还有一种方法来获取该文件的MIMEtypes?

不从单独的文件名。

或者从文件pathUri中确定内容Uri的方法?

不一定有“内容乌里”。 欢迎您尝试在MediaStore查找文件,并查看是否由于某种原因,正好知道MIMEtypes。 MediaStore可能会或可能不知道MIMEtypes,如果不知道,则无法确定它。

如果你有content:// Uri ,在ContentResolver上使用getType()来获得MIMEtypes。

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

 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; } 

如果未能确定MIMEtypes,它将返回null。

首字节包含文件扩展名

 @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; }