Androidでのカメラ連動するアプリでのカメラの呼び出し方とデータ取得方法
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通りあることが分かりました。
- 呼び出し時に保存して欲しいパスを指定する方法
- 生データをそのまま受け取る方法
Uriオブジェクトを生成して、IntentにputExtraでキーを「MediaStore.EXTRA_OUTPUT」でセットします。
Uriオブジェクトの生成方法は、こんな感じです。
SDカードに書き出しをしているのでAndroidManifest.xmlに以下のパーミッションを追加します。
画面の回転で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」でこのように
データの復元を行います。
参考になるサイト
注)表示される画像の角度が撮影時と違うと思いますが、Exif情報から修正する為には、こちらの記事を参考にして下さい。
関連する記事:
- Androidで懐中電灯アプリを作ってたら「 preview window is NULL! 」が出た話し
- AndroidManifest.xmlに記述した
のデータ取得方法 - ZXingを利用してAndroidでQRコードを読み込むサンプル
- 暗黙的インテントの呼び出しでActivityNotFoundExceptionを防ぐ方法
- Androidでカメラアプリを作る場合の注意点
はじめまして、こんにちは
只今、カメラを使ったandroidアプリを作成していまして、参考にさせていただいております。
一応、動いているのですが、上のソースでいうmImageUriがnullになるときがあり、困っています。
どうやら、カメラ起動後に端末の向きを変えて写真を撮ったときに発生しているようでした。
バージョンは2.2で作成していて、確認している端末のバージョンは3.2(acer iconia a100)です。
なにかご存知でしたら、教えてください。
よろしくお願いいたします。
その現象は、多分「android:configChanges=”orientation”」このイベントが発生してActivityが再生成されたのだと思います。
なので、Activityのインスタンス変数が初期化されてしまって、NULLになったのだと思います。
サンプルプログラム作って記事も更新しますのでしばしお待ち下さい。
更新ありがとうございます。
やってみます。
できました。
onSaveInstanceStateとonRestoreInstanceStateが呼ばれました。
助かりました。ありがとうございました。
よかったです。
また、何か分からない事がございましたら気軽にご質問してください。