カメラでキャプチャした写真の向きを取得する

androidの大いなる機能であるIntentはシステムアプリのカメラを制御することも可能であり、MediaStore.ACTION_IMAGE_CAPTUREアクションを送信するだけで

  • キャプチャした写真をバイトデータで返す
  • キャプチャした写真を任意の保存可能な場所に保存する

これらを実行することができる。

前者は非常に便利なのだが、Intentで送受信できるデータの制限により実際にキャプチャした写真よりかなり小さなサイズしか取得することができない(1024*50)ので、デバイスのカメラの性能をフルに使った写真をキャプチャするには後者を使うしかない。

これで殆どコードを書かずに写真を撮影する機能をアプリケーションに追加できる。

既に書いたようにキャプチャはandroidのカメラアプリを使って行い、アプリケーション側では取り込んだ画像をImageView表示している。簡単なはずなのだが何も考えずに
実行すると困ったことが起きる。

  • 縦向き(Portrait)でのキャプチャ


使用しているデバイスはGALAXY Nexus。通常使うように縦にもったままでキャプチャしたイメージをアプリケーションで取り込んだ。これは期待通りの結果だ。

  • 横向き(Landscape)のキャプチャ


こちらはデバイスを横に倒してキャプチャした結果。androidのカメラの向きとしてはこちらがデフォルトだが、これが問題だった。横向きのままキャプチャしたにも関わらず、アプリケーションでそのまま取り込んだ所このように縦向きで表示される。90度回転してしまった訳だが、本来横長だった画像が縦に表示されたことによって画像本来のアスペクト比が狂ってしまった。これでは使い物にならない。

さて、やることは

  • デバイスの向き(写真の向き)を認識して、正しい向きでアプリケーションに取り込む

なのだが、これが結構苦労するはめとなるのだった。