今回はJPEGファイルのExif情報を取得する方法を説明します。
Exifのフォーマットを知っていればバイナリデータを解析して取得することも可能ですが、Androidではandroid.media.ExifInterfaceクラスを使うことで簡単に取得することが可能です。
ExifInterfaceクラスはAndroid2.0(API5)から追加されたクラスです。さらに、Android2.2(API8)、Android2.3(API9)、Android3.0(Honeycomb)でそれぞれ取得出来るExifのタグが増えています。
また、JPEGファイルの中にサムネイル画像が入っていれば取得することも可能です。
それでは続きで説明していきます。
コンストラクタ
ExifInterfaceクラスのコンストラクタは引数にファイル名を与えます。IOExceptionが発生する可能性があるのでtry,catchブロックを使います。ファイルが存在しなくてもログにエラーは出るだけで正常にコンストラクタは終了するので注意してください。
ExifInterface(String filename)
Exif情報の取得
ExifInterfaceクラスのgetAttributeメソッドを利用します。引数に取得するタグを指定します。
public String getAttribute (String tag)
例えば撮影機器モデル名を取得するには下記のように記述します。(ここでのeiはExifInterfaceのインスタンスです)
ei.getAttribute(ExifInterface.TAG_MODEL);
もしJPEGファイルにそのExif情報が無い場合や、ExifInterfaceのコンストラクタで指定したファイルが存在していなかった場合にはこのメソッドの戻り値がnullになります。
その他のタグはサンプルコードやAndroidDevelopersを参照してください。
サムネイルの取得
サムネイルを取得するにはgetThumbnailメソッドを利用します。
public byte[] getThumbnail()
戻り値はbyte[]なので、実際にはBitmapFactoryクラスのdecodeByteArrayメソッドでBitmapクラスにデコードするなどして利用します。
JPEGファイルにサムネイルが存在しない場合にはnullが返ります。
byte[] data = ei.getThumbnail(); if (null == data) { Log.d(TAG, "No Thumbnail"); return null; } Bitmap thumb = BitmapFactory.decodeByteArray(data, 0, data.length);
サンプルコードについて
サンプルコードをそのまま動かしてみる場合は、SDカードにsample.jpgという名前で適当なJPEGファイルを配置してください。
onCreateメソッドでファイルを指定しているので、ここを任意のファイル名(及びパス)に修正してもらう方法もあります。
サンプルコードはAnroid2.3(API9)向けの記述をしています。Honeycombで取得できるExif情報はコメントアウトしていますので、マニフェストファイルの修正とHoneycombで動作させる場合はコメントを外してください。