ページ

2013/05/14

[Android]拡張子からMIME Typeを返す関数

Intent でメールにファイルを添付する場合は MIME Type を指定する必要がある。
いちいち MIME Type まで定義するのは面倒なので拡張子から判断して貰いたい、
と思っていたらちょうどいい関数があったのでお手軽に使えるようにしておいた。

URLEncoder#encode | Android Developersでエンコードすれば
日本語名ファイルでも正しく取得することができる。
/**
 * ファイルパスの拡張子から MIME Type を取得する
 * 
 * @param filePath
 * @return
 */
public static String getMimeType(String filePath){
    String mimeType = null;
    String extension = null;
    try{
        extension = MimeTypeMap.getFileExtensionFromUrl(URLEncoder.encode(filePath, "UTF-8"));
    }catch(UnsupportedEncodingException e){
        e.printStackTrace();
    }
    if(extension != null){
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        mimeType = mime.getMimeTypeFromExtension(extension);
    }
    return mimeType;
}
しかし、これでは半角スペースが + になってしまうので半角スペース混じりのファイル名からは
MimeTypeMap#getFileExtensionFromUrlが拡張子を取得できない。
そのため、普通に文字列処理で拡張子を取得する方法に変更した。
/**
 * ファイルパスの拡張子から MIME Type を取得する
 * 
 * @param filePath
 * @return
 */
public static String getMimeType(String filePath){
    String mimeType = null;
    String extension = null;
    int index = filePath.lastIndexOf(".");
    if(index > 0){
        extension = filePath.substring(index + 1);
    }
    MimeTypeMap mime = MimeTypeMap.getSingleton();
    if(extension != null){
        mimeType = mime.getMimeTypeFromExtension(extension);
    }
    return mimeType;
}
だが、そんな試行錯誤も虚しく英数字以外の文字列のファイル名はメールに添付できないようだった。

参考
Android: should I use MimeTypeMap.getFileExtensionFromUrl()? [bugs] - Stack Overflow