2011/05/09

ファイル名からMIMEタイプを判定する

約1ヶ月ぶりの更新。

今日はAndroidネタです。
Android3.0向けのファイラを作成しているのですが、ファイルをタップするとそれに対応するアプリケーションを起動する機能が欲しくなりました。この機能は、Androidが持っている「インテント」を使うと実現できるようです。

インテントについては下記のページなどを参照してください。

インテントを使うときには、MIMEタイプを指定する必要があるのですが、
ファイル名から自分で拡張子を切り出し、数千個もある拡張子からMIMEタイプを判定するコードは書きたくありません。

幸運な事に、AndroidにはMIMETypeMapという、MIMEのデータベースのようなものがあるので
これを利用して各ファイルのMIMEタイプを判定することができます。
getFileExtensionFromUrlを使って拡張子を取得し、getExtensionFromMimeType(String mimeType)に拡張子を渡すとMIMEタイプが返ってきます。
判定できないときもあるので、その場合は別途処理が必要です。

以下、ファイル名を渡すとMIMEタイプが返ってくるコードのサンプルです。
手元では動いているのでたぶん大丈夫。。。

   /**
* 渡されたファイル名から、MIMEタイプを返します。
*
*/
private String getMIMEType(String targetFile)
{
String url=URLEncoder.encode(targetFile);
String extention=MimeTypeMap.getFileExtensionFromUrl(url);
String mtype="";

//拡張子を小文字に変換
extention=extention.toLowerCase();

mtype=MimeTypeMap.getSingleton().getMimeTypeFromExtension(extention);
if (mtype==null)
{
//ソースコードなどは判定してくれないので自分で判定する

String PLANETEXT="text/plain";
if(
//テキストエディタで開けそうなソースファイルはテキストとして登録
(targetFile.endsWith(".c")) ||
(targetFile.endsWith(".cp")) ||
(targetFile.endsWith(".cpp")) ||
(targetFile.endsWith(".java")) ||
(targetFile.endsWith(".txt")) ||
(targetFile.endsWith(".c++")) ||
(targetFile.endsWith(".sh")) ||
(targetFile.endsWith(".cmake")) ||
(targetFile.endsWith(".ini")) ||
(targetFile.endsWith(".php")) ||
(targetFile.endsWith(".py"))
)
mtype=PLANETEXT;
}

if( mtype==null) mtype="";
return mtype;
}




ではまた。

0 件のコメント:

コメントを投稿