Galleryから取得した画像のExifメタタグが読み込めない
IntentでGalleryを呼び出して、選択した画像のメタタグを読み込み、GPS情報等の情報を取得するプログラムを作ってみた。
メタタグの読み込みはExifInterfaceクラスを用いる。
インスタンス生成にはJPEGファイルのディレクトリが必要なので、
Galleryから取得したURIをContentResolverでディレクトリ文字列に変換したものを設定することにした。
Galleryからのコールバックメソッドの部分を以下に示す。
public void onActivityResult(int requestCode, int responseCode, Intent data) { if (requestCode == REQUEST_GALLERY && responseCode == RESULT_OK) { // URIを取得 Uri uri = data.getData(); // ContentResolverを用いてURIが示す画像ファイルの情報を取得 Cursor c = getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null); String filePath = null; if (c.moveToFirst()) { int index = c.getColumnIndex(MediaStore.Images.Media.DATA); // 画像ファイルのディレクトリを取得 filePath = c.getString(index); } try { // ExifInterfaceインスタンスを生成 ExifInterface exif = new ExifInterface(filePath); // TODO タグ情報を取得 } catch (IOException e) { e.printStackTrace(); } } }
GalaxyS4(4.2)では取得できるのだが、Nexus7(4.4.2)では以下のようなエラーが発生する。
03-12 22:34:01.571 21283-21283/net.atlabo.sample.exif E/JHEAD﹕ can't open '/storage/emulated/0/Download/20140309_172716.jpg’
調べてみたら、こんなことが書いてあった。
http://stackoverflow.com/questions/21857327/exifinterface-jhead-cant-open-error-android
どうやらAndroidManifest.xmlにSDカード書き込み権限を付与してやらないといけないらしい。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
機種依存なのかAndroidAPIなのかは調べてないが、これで解決。