Download - Android Hacks - Hack30
ANDROIDHACKS#30 カメラを使う担当: Tatsuki Higashi
Twitter : @htk16
23/04/12
1
この資料について• この資料は下記の本をベースに勉強会で作成した資料です。
• 『 Android Hacks』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)
• この本の紹介ページが下記にあります。
• http://www.oreilly.co.jp/books/9784873114569/
23/04/12
2
アジェンダ• カメラからの情報を取得する
• カメラの画像を画面に表示する• Hackをさらに Hackする
• カメラの画像をファイルに保存する (写真を撮る)• プレビュー画像を取得する
23/04/12
3
0. 始める前に自分の環境だけかもしれないが, Hack30のサンプルはそのまま
ビルドできませんでした.
-> srcディレクトリ以下の .svnディレクトリを削除して対応
23/04/12
4
1. カメラからの情報を取得する
23/04/12
5
1. カメラからの情報を取得• カメラを使えるようにする
• AndroidManifest.xml のmanifestタグに以下を追加<uses-permission android:name="android.permission.CAMERA" />
• 必要ならば,カメラの機能を有効にする<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
•前者はカメラを使うならば必要?
23/04/12
6
1. カメラからの情報を取得• カメラ利用の流れ
1. Camera.open: カメラのインスタンス取得2. Camera.getParameter: カメラの各種パラメータ取得
Camera.Parameter 型でパラメータを返す3. Camera.setParameter: 必要ならば,パラメータ変更 4. Camera.setCameraOrientation: 必要ならば,角度の補正5. Camera.setPreviewDisplay: 初期化された SurfaceHolder を渡す
• これをやらないと previewができない
6. Camera.startPreview: カメラの映像で Surfaceを更新し始める7. Camera.stopPreview: previewを停止する8. Camera.release: カメラを返却する
23/04/12
7
1. カメラからの情報を取得• 解像度を変更する
• Camera.Parameter.setPreviewSize(int width, int height)1. Camera.getParameter でカメラのパラメータを取得2. Camera.Parameter.setPreviewSizeでパラメータ変更3. Camera.setParameter で変更したパラメータを設定
• Activityのサイズ変更に追従して変更する場合は以下の callbackメソッド内で行うのが良いActivity.surfaceChanged(SurfaceHolder h, int format,
int width, int height)
23/04/12
8
1. カメラからの情報を取得• SurfaceHolder
• 4種類の surfaceが利用可• SURFACE_TYPE_GPU
GPU描画に対応した surface 非推奨• SURFACE_TYPE_HARDWARE
DMA転送に対応したハードウェア surface 非推奨
• SURFACE_TYPE_NORMAL通常(?)の surface
• SURFACE_TYPE_PUSH_BUFFERSbufferを持たない surface カメラで使うの
はこの種類• SurfaceHolder.addCallback
callback interfaceになる activityなどを追加する23/04/12
9
1. カメラからの情報を取得• CameraPreview (例 30-1 29〜 79)
• SurfaceViewの派生クラス• コンストラクタで SurfaceHolderを作成し,
CameraPreviewをその callback interfaceとして登録• CameraPreview.surfaceCreated
• カメラに preview surfaceを与える• CameraPreview.surfaceChanged
• カメラの解像度を変更• CameraPreview.surfaceDestroyed
• 後始末• MainActivity (例 30-1 13〜 74)
• onCreateで CameraPreviewのインスタンスを ContentViewとして指定
23/04/12
10
2. Hackをさらに Hackする- カメラ画像をファイル
に保存
23/04/12
11
2. カメラ画像を保存• カメラ利用の流れ
1. カメラのインスタンス取得2. カメラの各種パラメータ取得3. 必要ならば,パラメータ変更 4. 必要ならば,角度の補正5. 初期化された SurfaceHolder を渡す6. カメラの映像で Surfaceを更新し始める7. 画像をキャプチャする
1. Camera.takePicture: 静止画像を取得2. Camera.startPreview: カメラの更新を再開
8. previewを停止する9. カメラを返却する
23/04/12
12
2. カメラ画像を保存• Camera.takePicture(Camera.ShutterCallback shutter,
Camera.PictureCallback raw,Camera.PictureCallback postview,Camera.PictureCallback jpeg)
• shutter: シャッターが押されたときの callback interface• Camera.ShutterCallback.onShutter
• raw: 処理前画像を取得したときの callback interface• Camera.ShutterCallback.onPictureTaken
• postview: postview image を取得したときの interface ?基本的には nullを与える
• jpeg: jpeg画像を取得した際の callback interface• Camera.ShutterCallback.onPictureTaken
23/04/12
13
2. カメラ画像を保存• Camera.ShutterCallback.onPictureTaken(byte[] data,
Camera cam)
• data: rawの callback interface なら未処理画像, jpegなら jpeg圧縮された画像のバイナ
リデータ
23/04/12
14
2. カメラ画像を保存• jpeg画像のキャプチャ (図 30-2)
• MainWithShutterActivity.onTouchEvent (図 30-2 77〜 90)• 画面を押し込んだなら画面をキャプチャ
• Camera.takePictureでキャプチャ• shutter, rawには何もしない interfaceを与える• jpegには画像をファイルに書き出す interfaceを与える
• Camera.startPreviewで previewを再開• 画面の押し込み以外のイベントならデフォルトの処理を行う
23/04/12
15
3. プレビュー画像を取得する
23/04/12
16
3. プレビュー画像を取得する• Camera.setPreviewCallback(Camera.PrevieCallback cb):カメラがプレビュー画像を取得した時に呼ばれるcallback interfaceを指定する
• Camera.PreviewCallback.onPreviewFrame(byte[] data, Camera cam)
• プレビューが更新されたときに呼ばれる• data: プレビュー画像 (YUV420SP形式)
• Bitmap画像の保存 (図 30-3)
• プレビューが更新されるたびにその画像をメモリ上に保持• 画面がタッチされたら保持しているデータから bitmap画像を作成
• この処理は時間がかかるので,別スレッドで実行
23/04/12
17
参考 URL• Android Developers | Camera
• http://developer.android.com/reference/android/hardware/Camera.html
23/04/12
18