2013-09-06 24 views
9

O ile mi wiadomo, istnieją tylko trzy sposoby, aby typ MIME mógł odczytać istniejące pytania.Android - pobierz typ MIME z pliku bez rozszerzenia

1) Ustalenie go od rozszerzenia pliku przy użyciu MimeTypeMap.getFileExtensionFromUrl

2) "Zgadnij" używając inputStream z URLConnection.guessContentTypeFromStream

3) Używanie ContentResolver aby uzyskać typ MIME używając zawartości Uri (zawartość: \) context.getContentResolver().getType

Jednak mam tylko obiekt pliku, z możliwym do uzyskania Uri będącym ścieżką pliku Uri (plik :). Plik nie ma rozszerzenia. Czy jest jeszcze sposób na pobranie typu MIME pliku? Lub sposób na określenie treści Uri ze ścieżki pliku Uri?

+0

http://stackoverflow.com/a/30765320/2765497 – Flinbor

Odpowiedz

2

Czy jest jeszcze sposób na pobranie pliku MIME?

Nie tylko z nazwy pliku.

Lub sposób ustalenia zawartości Uri ze ścieżki pliku Uri?

Niekoniecznie istnieje "treść Uri". Możesz spróbować znaleźć plik w numerze MediaStore i sprawdzić, czy z jakiegoś powodu zdarza mu się poznać typ MIME. MediaStore może lub nie może znać typu MIME, a jeśli nie, nie ma sposobu, aby to ustalić.

Jeśli zrobić mieć content://Uri użyć getType() na ContentResolver aby uzyskać typ MIME.

10

Czy próbowałeś tego? Działa to dla mnie (tylko dla plików obrazów).

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

Oczywiście można również korzystać z innych metod, takich jak BitmapFactory.decodeFile lub BitmapFactory.decodeResource tak:

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

Powróci null, jeśli nie udało się określić typ MIME.

+1

'BitmapFactory' zadecyduje tylko typów MIME plików graficznych chociaż. –

+0

Tak, oczywiście, zapomniałem dodać tego wyjaśnienia :) Dzięki – BornToCode

1

Pierwsze bajtów zawiera rozszerzenie pliku

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