Androidでカメラと連動するアプリの作り方
2012/8/14 コメントを頂き、記事を追記修正し、サンプルプログラムを作成しました。
画像を編集するようなアプリを作成する場合、カメラをIntent経由で呼び出してとった写真のデータを戻してもらうことがあると思います。
その時にどのようにしたら、カメラを起動できて、どのようにしたらそのデータが取れるのか調べた結果です。
Intentでのカメラの呼び出し方
google謹製の「com.android.camera」カメラアプリを調べると2つそれらしいintent-filterが設定されていました。
- android.media.action.IMAGE_CAPTURE
- android.media.action.STILL_IMAGE_CAMERA
の2つです。
どちらを使えばいいか調べてみると
正解は、「android.media.action.IMAGE_CAPTURE」でした。
もう一つの方は連携するのでは無く、静止画モードでカメラアプリを起動するというintent-filterでした。
ですので、まずカメラアプリに写真をとってそのデータを返却して欲しい場合は、以下のようにカメラアプリを起動する必要があります。
Intentでカメラを呼び出した場合のデータの取得方法
これもまた、google謹製の「com.android.camera」カメラアプリを調べてみました。
2通りあることが分かりました。
- 呼び出し時に保存して欲しいパスを指定する方法
- 生データをそのまま受け取る方法
カメラアプリでは、
こんな感じにファイルパスを取得していました。
で、さらに
こんな感じでファイルを作成したりデータをintentにセットしていました。
なので取得する側では、
こういう風に処理して取得できます。
ですが…、Bitmapの画質が悪過ぎでこれは使い物になりません。
なので、画像ファイルとして保存してもらって、データを取得するように変更します。
まずは、呼び出し処理、
Uriオブジェクトを生成して、IntentにputExtraでキーを「MediaStore.EXTRA_OUTPUT」でセットします。
Uriオブジェクトの生成方法は、こんな感じです。
SDカードに書き出しをしているのでAndroidManifest.xmlに以下のパーミッションを追加します。
で、データの取得方法は、
このように指定したUriにファイルが作成されるので取得すると操作出来るようになります。
で、色々調べていたら詳しく書かれているサイトがありました。
こちらを参考にする方がいいかもです。
画面の回転でUriが初期化される場合の対応方法
今回は、UriをActivityのインスタンス変数として保持しました。
その為に、Activityが再生成されてしまうとUriが初期化されてしまいます。
画面の縦横の回転の処理が動作するとAndroidは、Activityを破棄して再生成します。そうなると見事インスタンス変数はNULLになります。
これを防ぐ為の方法は、2つ程あります。
- 回転時の処理を独自に実装にしてActivityの再生成を防ぐ。
- Activityの破棄、再生成時に状態を保持するように処理を追記する。
今回サンプルプログラムでは2.の方法で実装しました。
まずは、
1.回転時の処理を独自に実装にしてActivityの再生成を防ぐ
こちらの実装は簡単で、まずは「AndroidManifest.xml」に「android:configChanges=”orientation|screenSize”」の記述を追記します。
そうすると、画面の回転時にActivtyの再生成が行われずに「onConfigurationChanged」が実行されます。
これで、画面の回転でActivityが初期化される事はありませんが、横になっても、レイアウトが横になりません。
2.Activityの破棄、再生成時に状態を保持するように処理を追記する
今回サンプルではこちら、
- protected void onSaveInstanceState(Bundle outState)
- protected void onRestoreInstanceState(Bundle savedInstanceState)
の2つのメソッドをオーバーライドをして、
「onSaveInstanceState」でデータの保存を
「onRestoreInstanceState」でデータの復元を行います。
これで、インスタンス変数の情報を保持します。
今回の場合は
「onSaveIncetanceState」で、
このように、Bundleにインスタンス変数のUriを保存して
「onRestoreInstanceState」でこのように
データの復元を行います。
動作サンプル:https://github.com/nasneg/SampleCameraIntent
参考になるサイト
注)表示される画像の角度が撮影時と違うと思いますが、Exif情報から修正する為には、こちらの記事を参考にして下さい。