2013-09-06 5 views
9

Soweit ich weiß, gibt es nur drei Möglichkeiten, den MIME-Typ von den vorhandenen Fragen zu lesen.Android - MIME-Typ aus Datei ohne Erweiterung abrufen

1) aus der Dateierweiterung Bestimmung unter Verwendung MimeTypeMap.getFileExtensionFromUrl

2) "erraten" unter Verwendung des inputStream mit URLConnection.guessContentTypeFromStream

3) Verwenden der ContentResolver den MIME-Typen unter Verwendung von Inhalt Uri (Inhalts zu erhalten: \) context.getContentResolver().getType

Allerdings habe ich nur das Dateiobjekt, mit dem erhältlichen Uri ist der Dateipfad Uri (Datei :). Die Datei hat keine Erweiterung. Gibt es noch eine Möglichkeit, den MIME-Typ der Datei zu erhalten? Oder eine Möglichkeit, den Inhalt Uri aus dem Dateipfad Uri zu ermitteln?

+0

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

Antwort

2

Gibt es noch eine Möglichkeit, den MIME-Typ der Datei zu erhalten?

Nicht aus dem Dateinamen allein.

Oder eine Möglichkeit, den Inhalt Uri aus dem Dateipfad Uri zu bestimmen?

Es gibt nicht unbedingt einen "Inhalt Uri". Sie können gerne versuchen, die Datei in MediaStore zu finden und zu sehen, ob es zufällig den MIME-Typ kennt. MediaStore kann oder kann nicht den MIME-Typ kennen, und wenn nicht, gibt es keine Möglichkeit, es zu bestimmen.

Wenn Sie haben content://Uri, getType() auf einem ContentResolver verwenden tun den MIME-Typ zu erhalten.

10

Haben Sie das versucht? Es funktioniert für mich (nur für Bilddateien).

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

Natürlich können Sie auch andere Methoden, wie BitmapFactory.decodeFile oder BitmapFactory.decodeResource wie folgt verwenden:

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

Es wird null zurück, wenn es versäumt, die MIME-Typ zu bestimmen.

+1

'BitmapFactory' nur wenn MIME-Typen von Bilddateien bestimmen. –

+0

Ja, natürlich habe ich vergessen, diese Erklärung hinzuzufügen :) Danke – BornToCode

1

Erstes Bytes enthält Dateierweiterung

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