2011年11月7日月曜日

ImageView.setImageURI() の動作

自分のAndroidアプリにカメラ機能をつけたいと思った時は、
2つの選択肢がある。

1.sarfaceViewを使って、独自のカメラ機能を作りこむ
2.標準カメラをIntent呼び出しする

どちらの選択肢にもメリット・デメリットはあるが、

画面デザインの統一感や、ギャラリーには保存したくないなど
細かい設定が必要でなければ、「2」をおすすめする。

カメラ機能は、各メーカーで独自仕様のため、「1」を選択すると
思わぬ苦労を背負い込むことになる。

私が「1」を選択した時は、以下のような状態になった・・・

<正常>
IS04(2.1)
IS04(2.2)
GaraxyS(2.3)
Xperia Arc(2.3)

<異常>
HTC Desire HD(2.3)
HTC EVO(2.2)

もちろん一つずつ対応していくことは可能ではあるが、
それには、新しい端末が発表されるたびに動作確認しなければならず
膨大な手間と実機の準備が必要になる。

この時は、「2」を選択することになった。

ただし、「2」を選択しても、考慮すべきことは色々ある。
そのうちの一つである、タイトルに記載した内容について
以下に簡単にまとめる。

ここから、ようやく本題

2つのActivityが存在しており、ここでは「A」と「B」とする。
以下のような処理を行った際に、「2.1」と「2.2」では動作が違うようです。

A で標準カメラ機能を使って撮影した画像のUri オブジェクトを
B にIntentで受け渡し、渡されたUri オブジェクトを使って画像を表示する。

<Aの処理>
File file = new File(dir, filename);
Uri uri = Uri.fromFile(file);
Intent intent.setData(uri);

<Bの処理>
Uri uri = getIntent().getData();
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(uri);

上記のコードは、2.2では正常に画像が表示される。
しかし、2.1では特にエラーにはならないが画像は表示されない。

<Bの処理>
Uri uri = getIntent().getData();
File file = new File(uri.getPath());
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(Uri.parse(file.toString));

このように書き直すと、2.1、2.2の両方で画像が表示される。

2.1 では、Uri.fromFile() と Uri.parse() で取得できる情報に違いがあるのか・・・
時間ができた時にでも追いかけてみたい。