アンドロイドのカメラアプリを作成するにあたっての雑感。
アンドロイドのアプリで
「サイズを指定すると落ちる」
「カメラのプレビューがなぜか歪んでいる」
「プレビューと撮影した写真で画角が異なる」
という状態がおこります。(機種によって。)
この原因を考えました。
下記より仮定及び、推測です。
まず、「サイズを指定すると落ちる」という問題です。
Android: まとめ 各端末のカメラのサポート画像サイズ
でサポートされているサイズが記載されていますが、見て分かるように機種によってサイズがばらばらです。
作成側としては画面一杯のサイズで取得をしたい時に
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
Camera.Parameters parameters = myCamera.getParameters();
parameters.setPreviewSize(width, height);
myCamera.setParameters(parameters);
myCamera.startPreview();
}
と記載をします。これが画面一杯のサイズでプレビューが表示されます。
しかし、画面のサイズをプレビューでサポートしてない場合に落ちます。
これは、機種の設計ミスと言ってもよいかと思うのですが、いくつかのアンドロイドで起こる事象の為、画面のサイズを指定してはいけません。
画面のサイズは指定しない方が無難かもしれません。
次に「カメラのプレビューがなぜか歪んでいる」と言う問題です。
プレビューサイズは指定をした場合に、サイズは表示されるサイズでなく解像度です。
実際には、surfaceviewのサイズで表示されます。
つまり、プレビューサイズを正方形に指定をしていた場合にもsurfaceviewの形が長方形であれば、引き伸ばされた形で表示がされてしまいます。
デフォルトで設定されている、プレビューの比率が画面のサイズと異なる場合には、値を指定しない場合には歪みます。
最後に「プレビューと撮影した写真で画角が異なる」と言う問題です。
この問題が一番面倒な問題なのですが、
Android: まとめ 各端末のカメラのサポート画像サイズ
を見てもらうと分かるように、プレビューサイズに対応した画像サイズが存在しない場合があります。(比率的に)
つまり、プレビューサイズに対応した画像サイズが存在しない場合には、自分でbitmapの変換を行ってサイズを変更する必要があります。
上下が切れているのか左右が切れているのかが不明の為、サイズをどうしても変更する比率はあわせられても、厳密にプレビューの画角で撮影はできません。
どうしても、プレビューサイズと合わせたい場合は、縦横比が一致する画像サイズが存在するプレビューサイズを選んで撮影をするか、機種ごとに場合分けをするしかありません。
以上で、カメラを作成するにあたっての不具合です。
プレビューで使用できるサイズを取得する
Camera.Parameters.getSupportedPictureSizes();
画像の保存で使用できるサイズを取得する。
Camera.Parameters.getSupportedPreviewSizes();
を利用して場合わけをすれば、割と細かく設定ができますが、特に細かいところまでを考えなくてよい場合には
を利用して、マージンがあるプレビューで(ない場合もあります)撮影をすれば、
「サイズを指定すると落ちる」
「カメラのプレビューがなぜか歪んでいる」
を回避をする事ができるので、細かい設定は面倒くさいけど、比率などを合わせたい場合には最適かと思います。
プレビューのサイズができるだけ小さい方がメモリ的に有効な気もするので、一度がっつりライブラリ的なので適合できるようにできればと思います。
以上です。









