Android – Получить MIME-тип из файла без расширения

Насколько мне известно, существует только три способа заставить тип MIME читать существующие вопросы.

1) Определение его из расширения файла с использованием MimeTypeMap.getFileExtensionFromUrl

2) «Угадай», используя inputStream с URLConnection.guessContentTypeFromStream

3) Использование ContentResolver для получения типа MIME с использованием содержимого Uri (content: \) context.getContentResolver().getType

Тем не менее, у меня есть только файл-объект, причем доступным Uri является путь к файлу Uri (файл :). Файл не имеет расширения. Есть ли способ получить MIME-тип файла? Или способ определить содержание Uri из пути файла Uri?

Solutions Collecting From Web of "Android – Получить MIME-тип из файла без расширения"

Есть ли способ получить MIME-тип файла?

Не из имени файла.

Или способ определить содержание Uri из пути файла Uri?

Не обязательно «контент Uri». Вы можете попытаться найти файл в MediaStore и посмотреть, почему, по какой-то причине, он знает тип MIME. MediaStore может знать или не знать тип MIME, а если нет, определить его невозможно.

Если у вас есть content:// Uri , используйте getType() в ContentResolver чтобы получить тип MIME.

Вы пробовали это? Он работает для меня ( только для файлов изображений ).

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

Он вернет null, если не сможет определить тип MIME.

Первые байты содержат расширение файла

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