Android Hacks - Hack30

18
ANDROID HACKS #30 カカカカカカ カカTatsuki Higashi Twitter : @htk16 22/08/25 1

description

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。http://www.oreilly.co.jp/books/9784873114569/

Transcript of Android Hacks - Hack30

Page 1: Android Hacks - Hack30

ANDROIDHACKS#30 カメラを使う担当: Tatsuki Higashi

Twitter : @htk16

23/04/12

1

Page 2: Android Hacks - Hack30

この資料について• この資料は下記の本をベースに勉強会で作成した資料です。

• 『 Android Hacks』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)

• この本の紹介ページが下記にあります。

• http://www.oreilly.co.jp/books/9784873114569/

23/04/12

2

Page 3: Android Hacks - Hack30

アジェンダ• カメラからの情報を取得する

• カメラの画像を画面に表示する• Hackをさらに Hackする

• カメラの画像をファイルに保存する (写真を撮る)• プレビュー画像を取得する

23/04/12

3

Page 4: Android Hacks - Hack30

0. 始める前に自分の環境だけかもしれないが, Hack30のサンプルはそのまま

ビルドできませんでした.

-> srcディレクトリ以下の .svnディレクトリを削除して対応

23/04/12

4

Page 5: Android Hacks - Hack30

1. カメラからの情報を取得する

23/04/12

5

Page 6: Android Hacks - Hack30

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

Page 7: Android Hacks - Hack30

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

Page 8: Android Hacks - Hack30

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

Page 9: Android Hacks - Hack30

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

Page 10: Android Hacks - Hack30

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

Page 11: Android Hacks - Hack30

2. Hackをさらに Hackする- カメラ画像をファイル

に保存

23/04/12

11

Page 12: Android Hacks - Hack30

2. カメラ画像を保存• カメラ利用の流れ

1. カメラのインスタンス取得2. カメラの各種パラメータ取得3. 必要ならば,パラメータ変更 4. 必要ならば,角度の補正5. 初期化された SurfaceHolder を渡す6. カメラの映像で Surfaceを更新し始める7. 画像をキャプチャする

1. Camera.takePicture: 静止画像を取得2. Camera.startPreview: カメラの更新を再開

8. previewを停止する9. カメラを返却する

23/04/12

12

Page 13: Android Hacks - Hack30

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

Page 14: Android Hacks - Hack30

2. カメラ画像を保存• Camera.ShutterCallback.onPictureTaken(byte[] data,

Camera cam)

• data: rawの callback interface なら未処理画像,    jpegなら jpeg圧縮された画像のバイナ

リデータ

23/04/12

14

Page 15: Android Hacks - Hack30

2. カメラ画像を保存• jpeg画像のキャプチャ (図 30-2)

• MainWithShutterActivity.onTouchEvent (図 30-2 77〜 90)• 画面を押し込んだなら画面をキャプチャ

• Camera.takePictureでキャプチャ• shutter, rawには何もしない interfaceを与える• jpegには画像をファイルに書き出す interfaceを与える

• Camera.startPreviewで previewを再開• 画面の押し込み以外のイベントならデフォルトの処理を行う

23/04/12

15

Page 16: Android Hacks - Hack30

3. プレビュー画像を取得する

23/04/12

16

Page 17: Android Hacks - Hack30

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

Page 18: Android Hacks - Hack30

参考 URL• Android Developers | Camera

• http://developer.android.com/reference/android/hardware/Camera.html

23/04/12

18