カメラプレビューと画面の向き

1,934 views
Skip to first unread message

Y.Sasaki

unread,
Jun 21, 2010, 4:43:34 AM6/21/10
to android-g...@googlegroups.com
ささきと申します

androidのカメラは横向き専用とのことで、大部分のカメラアプリケーションは
landscape固定で作成されているように見受けられます。

しかし中には、XPERIAのカメラアプリや、Camera Illusionといった縦横両方の
向きに対応しているものも存在します。

アプリをlandscaepe固定で作成すると、本体を縦にした時に
オプションメニューやステータスバーの方向にどうしても違和感があるため
何とかしたいと思い、あれこれ試してみたのですがどうもうまくいきません。

カメラプレビューサイズは横長にしか設定出来ない様ですが、portraitで成り行
きにまかせると、SurfaceViewが縦長になるため、そのままではアスペクト比が
狂い表示がひしゃげてしまいます。

何か良い方法をご存知の方がいらっしゃいましたらご教授下さい。
よろしくお願いいたします。

Tetsuya Ishida

unread,
Jun 21, 2010, 5:28:39 AM6/21/10
to android-g...@googlegroups.com
ささきさん
こんにちは、石田(T)@福岡県と申します。

ベストとは思いませんが、ぱっと思いつく範囲です。
お役に立てなかったらすみません。

1)撮った画像を回転させる
私はこれを実際にやったとことはありませんが、Matrix.postrotate() を
Bitmap.createBitmap()に渡すことで可能ではないかと思います。

2)標準カメラアプリをインテントで呼び出す。
下記は別件で以前ポストした内容です。
http://groups.google.co.jp/group/android-group-japan/browse_thread/thread/8c9103153e59511d

以上

Y.Sasaki

unread,
Jun 21, 2010, 6:05:20 AM6/21/10
to android-g...@googlegroups.com
石田様
ささきでございます

レスありがとうございます。
静止画の取り込みですとご指摘のような方法が有効かと思いますが、
ARチックな事をやりたいと思っておりまして、具体的には下記のようなコードで

 
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (IOException e) { ....... }
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
camera.stopPreview();
Parameters para=mCamera.getParameters();
para.setPreviewSize(width,height); 
camera.setParameters(para);   // width height が縦長だと 指定が無視
されてしまう
camera.startPreview();
}

  どこかでMatrixによる回転みたいなことを指示できないか?なども模索して
みたのですが、
  SurfaceHolderにもCameraにもそれらしいものが見つけられませんでした。

 よろしくおねがいいたします。

y ikeda

unread,
Jun 21, 2010, 6:26:32 AM6/21/10
to android-g...@googlegroups.com
ささきさん
池田と申します。

ちょうどカメラアプリをいじっていましたので、共有します。
以下でほとんどの端末は縦表示いけると思います。

Parameters params = mCamera.getParameters();
params.set("orientation", "portrait");
mCamera.setParameters(params);

しかし、この方法だとHTC Desireはどうも勝手が違うようで、
デフォルトのプレビュー画面が回転してない状態で表示されます。
上記を指定しない、もしくはparams.set("orientation", "landscape");に
切り替えてあげるなどの必要がでてくるようですので注意が必要です。
ちなみにActivityに対してlandscape固定の場合はDeisreでも問題ないようですので、
自分が調査した限りでは、landscape固定が無難な気がしますが、
他に良い方法があるかもしれません。

あるようでしたら私もぜひ知りたいところです。

また、補足ですが、Nexus OneやDeisreはカメラプレビューで
getSupportedPreviewSizes()で取得したPreviewSizeをSetしてあげないと
落ちるなどの問題もあるようですので、ご注意ください。
http://code.google.com/p/android/issues/detail?id=7909


2010年6月21日19:05 Y.Sasaki <ysa...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Y.Sasaki

unread,
Jun 21, 2010, 8:51:08 PM6/21/10
to android-g...@googlegroups.com
池田様
ささきでございます

> params.set("orientation", "portrait"); 

XPERIAで試して縦表示成功しました。情報まことにありがとうございました。

> しかし、この方法だとHTC Desireはどうも勝手が違うようで、

以前触る機会があった、Nexus Oneもバンドルのカメラアプリはlandscape固定の
Activityだったので、
同様かもしれません。機会があったらそちらでも試してみたいと思います。

> getSupportedPreviewSizes()

機種依存しないアプリ作成のために登場したメソッドだとは理解できますが、
SDK1.xに存在しないために、過渡期の現在は、逆にアプリの機種依存性が
高まってしまうつらさがありますね。

Reply all
Reply to author
Forward
0 new messages