【第0回】 Androidカメラ技術ネタ 【とりあえずカメラアプリを作る】

ブログ1発目:とりあえずカメラアプリを作る

カメラ小僧(開発,入社1年目)@デジカメ持ってないです。

ブログネタが思いつかないので、付けられたあだ名に因んでカメラネタを少しずつ書きます。

なんで第0回なのか?

カメラアプリ作成の基本的な構築手順はググるなり本を読むなりするとたくさん記事があるので、おおまかな説明とカメラアプリを作る際によくハマる問題点を説明するに留めるからです。第1回以降では、既に出来ているカメラアプリに機能を追加していく話を書きたいと思います。

カメラアプリ開発の手順

環境構築は済んでいることを前提に話をします。
(Javaをインストールと、Android SDKをダウンロードして、SDKの中に入っているADTがバンドルされたEclipseを起動すれば終わりです。詳しくはYahoo!知恵袋さんを参照してください:Androidアプリケーション開発環境の構築(ADTバンドル版SDK編)

開発の流れはこんな感じです。

1.EclipseでAndroid Application Projectを新規で作成してください。

2.Android ManifestでCameraとデータ書き込みのPermision(権限)を追加します。
manifestタグの中に書いてください。

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRIGHT_EXTERNAL_STORAGE" />

3.main.xmlにSurfaceView(カメラのプレビュー表示)とButton(撮影ボタン)を追加します。
もしくはSurfaceViewを継承してCameraViewというようなカスタムViewを作るとより機能拡張しやすくなります。

4.MainActivity.javaにSurfaceViewのCallBackメソッドとButtonのOnClickListenerを書いて、カメラの処理を書きます。

カメラの処理には
4-1.カメラの初期設定
4-2.ボタンを押したときに撮影を実行する
4-3.撮影後の処理(撮影を再開する、もしくは別の画面に遷移する)
などを書いてあげます。

こういう流れでカメラアプリは作られます。
より詳しい内容は@ITさんのサイトを参照してください。
@ITさん:”もはやケータイに必須のカメラをAndroidで制御しよう”

カメラアプリ開発のハマりどころ

・表示されている画像と撮影した画像が若干違う

この問題が発生する原因はCamera APIには、Preview(表示されている画像)とPicture(撮影された画像)の解像度を選択できるようになっているためです。たとえば、Previewが1600x900px(16:9)でPictureが3264x2448px(4:3)の場合、Previewの方が横長なので表示されている画像から横長になっている部分を削った結果が表示されます。つまり、両者が一致しなければ、画像は一致しないのです。
ただし、解像度が一致していなくても比率が一致していれば、画像が削られたり、表示されていないところが撮影されるということがなくなります。
このPreviewとPictureの解像度の設定は開発者が自由に細かい値を指定することはできません。各端末のカメラが持つ解像度リストから1つ選択する仕組みになっています。そのため、この問題を解決するためにはそれぞれの解像度リストから同じ比率の解像度を選択すればよいわけです。

Priviewの解像度リスト取得API:getSupportedPreviewSizes()
Pictureの解像度リスト取得API:getSupportedPictureSizes()

・メモリ不足

カメラアプリ開発ではこの問題がしつこく付き纏います。まず、撮影した画像が最高解像度の場合、その画像データは非常に大きくなり、普通に使おうとすると端末のメモリが足りません。また、画像として保存した後それをBitmapで呼び出したときも、そのまま呼び出した場合メモリが足りなくなります。他にも画像を加工するとき、通常のカメラで撮影された容量の大きい画像を捌く場合など、あらゆる場面でメモリが足りなくなります。
詳細はここでは書ききれないので次の回で説明したいと思います。

・カメラのプレビュー表示が90°ずれる

カメラアプリの初代からの不具合として縦型Activity(android:screenOrientation=”portrait”)の場合にカメラを表示すると、なぜか90°回転した状態で表示されます。この問題として、対処方法があるにはあるのですが、端末によってはその処理が効かないこともあります。私の場合、全ての端末でアプリが動作するようにしなければならないので、カメラの部分だけ横型Actyivity(android:screenOrientation=”landscape”)にしています。

初回はこんなところです。
次回はカメラアプリに手を加える話、もしくはカメラアプリ開発のトラブル対処について書きたいと思います。
以上です。

【第0回】 Androidカメラ技術ネタ 【とりあえずカメラアプリを作る】
【第1回】 Androidカメラ技術ネタ 【メモリ不足の対策】
【第2回】 Androidカメラ技術ネタ 【カメラの解像度を理解しよう】

カテゴリー: スマホアプリ, 技術開発 パーマリンク