自分の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() で取得できる情報に違いがあるのか・・・
時間ができた時にでも追いかけてみたい。