« [メモ]ツイキャスと震災と義援金について | メイン | MyRSS.jp サービス終了のお知らせ »

2011年04月06日

Androidのデバイス依存メモ[カメラ周り] あとで読む

さぁこれから Android な開発始めよう!って人には是非同じ苦しみを味わって欲しいので こんなエントリ書かずに影でこっそり皆が苦しむ様子を楽しんでいようと思ったのだけど、ま、残しておきますかね。デバイス依存系の問題。今回苦しんだ分だけでも。

※こちらの勘違いもあるかもしれないので、あくまでもメモということで。。


- OSのバージョン依存の問題

Android はカメラが使えるのだけど、Android 2.1 までは横向きにしか使えません。Android 2.2 から縦可能ね(ここコダワリだった)。でもってインカメラ使いたいときは Android 2.3 以降。

ん?Android 2.2 の端末でインカメラあるやつあるよね?って気付いた人はまさに悲劇への第一歩。
実装方法は、例えばある機種では、

Camera.Parameters.set("camera_id", 2)

のようにします。
フロントカメラがあるかどうか判別する方法(ない場合もある)やインカメラの指定方法はデバイス依存なので、どうしてもインカメラ対応したいのなら端末すべて検証してくださいな。(報われないと思うけど・・・)


- カメラプレビューの問題

Android ではカメラのプレビューの生データ (RGB じゃなくて YUV420フォーマット)をバッファに割りつけてアクセスできるんだけど、こいつも一筋縄ではいかないところがある。

通常は

Camera::setPreviewCallback()

を使うと思うのだけど、一部の端末ではこれがちゃんと動かない様子。だからもうこいつは使わないほうがいいと思う。

代わりに使うのがコレ

Camera::setPreviewCallbackWithBuffer();

で、こいつにも罠があって、端末によっては onPreviewFrame のコールバックが一回しか呼ばれない。
調べた結果、

Camera::addCallbackBuffer()

を onPreviewFrame が呼ばれるたびにセットしないといけないという罠があり・・・(これは罠じゃなくて仕様のようです。失礼しました)。この時点でいろいろ萎えかけてたわけですが・・・


- Samsung の問題

これまでのところ Samsung 端末だけなんですが、Preview を表示する画面のサイズにハード的な制約がある。
繰り返しますが Samsung だけ。
そのサイズというのが、Galaxy Tab は 1024 x 1024、Galaxy S が 800 x 800、Nexus S は知らん!という感じ。
このサイズを超える画面に Preview を表示することができないというなんともな仕様で・・・(もちろん、画面一杯でもギリギリ大丈夫な数値なんだけど、ちょい拡大してはみだして表示とかはできないわけですな)。

これを回避するには

if (Build.MANUFACTURER.equals("samsung"))

いれて特殊な場合分けします。いや、回避じゃねーし。


- トーチライト

震災のときに役立った iPhone の懐中電灯みたいなやつ、Android 2.2 でも API がサポートしてて、デバイスのトーチライトが利用可能かどうか調べることができるようになってます。

で、これを信用すると・・・一部デバイスでは、トーチライト使えるよと反応があるのに実際に API 叩いても光らない、という罠が待ってたりするわけで・・・(Samsung とか Samsung とか Samsung とか)。

Camera.Parameters::getSupportedFlashModes()

これ、調べて対応してたりすると時間がいくらあっても足りないので、「Android だから」という理由でもう流すのが良い感じかと。。


- オートフォーカス

同様に、追随式のオートフォーカスが API で対応したのは Android 2.3 から。でも 2.2 の端末も多くが追随式の AutoFocus もってたりするんですよね。
これ、なんとなく設定することができたり、ま、そうでなくてもオートフォーカスを使うことはできたりするんですが、中には API 叩いてもオートフォーカスが動かないやつもいたりしてちょいと注意が必要です。(SとかSとかSとか・・)

Camera.Paramters:: setFocusMode("continuous-video")

こういう問題って、stackoverflow とかでも「キミのコードは正しい。どこも間違ってない。でもそれが動かないのが Android だ。デバイス依存の世界へようこそ!」って回答ついてたりするんですよね・・・・Android 万歳!


ということで、細かい機能、ある程度は割りきって使うのがいい感じかと。
んで申し訳ないけど、端末依存の不具合はユーザーさんからの報告ベースで対応するのが現実的かと。。


と、カメラ周りで今回苦労した点をあげるとこんな感じ。他にも MEDIAS でプレビュー画面のレイアウトが勝手に崩れる問題(早速不具合修正版だしてきたけど、まだ直ってない気がする)とか、IS06でサポートされてる録音のサンプリングレートがオィオィな件とか いろいろあるんですけどね・・・。


ま、震災の中、こんな問題に苦労しながら地震酔いにも負けずにコツコツ作り続けたのが「ツイキャス・ライブ for Android」です。

地震のあと、正直モチベーション上げるのが難しかったんですが、自分が今やるべきことはこれだろ、ってことで頑張って作りました。
よろしければ試してみてください。

- ツイキャス・ライブ for Android

promotional.jpg

- ツイキャス Webサイト

投稿者 aka : 2011年04月06日 12:53  / 2011年04月 / 開発系

トラックバック

人気ブログランキング - a++ My RSS 管理人ブログ

このエントリーのトラックバックURL:
http://133.242.136.64/mt-tb-sf.cgi/854

コメント

自分はARアプリを作ろうとやっていましたけど、setPreviewCallbackだとコールバックが
つぎつぎ発生するせいでメモリを食い潰してアプリが落ちる時が多々あったので、
addCallbackBufferとsetPreviewCallbackWithBufferでタイミングを制御出来た方が便利でしたよ。
ちなみに、2.1以前はsetOneshotPreviewCallback使ってやってましたが、500~1000msecぐらいの間隔を開けて
呼ばないと何故かコールバックがこなくなる事があったのでかなり使い辛かったですが…

投稿者 taru : 日時 2011年04月07日 11:05

コメントしてください

あわせて読みたい




保存しますか?