Your SlideShare is downloading. ×
0
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Android Hacks - Hack30
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Android Hacks - Hack30

1,392

Published on

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

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

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,392
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×