portrait時のカメラプレビューの縦横について - ReDo

2010年10月 5日

portrait時のカメラプレビューの縦横について

android:screenOrientation="portrait"時のカメラプレビューについてちょっと追ってみました。

ベースのソース:以下の@ITの記事内CameraExample.zip参照。
@IT:もはやケータイに必須のカメラをAndroidで制御しよう
http://www.atmarkit.co.jp/fjava/rensai4/android17/android17_1.html

  • 結論:機種依存。Camera#setParametersのorientation設定は鬼門な印象。
  • 非対応サイズのCamera#setPreviewSize→DevPhone2(1.6)では無視される。X06HT(Desire,2.1)ではException。基本的にW>Hをしれっと設定しておけば良い。
  • Activityがportrait時のsetParameters("orientation", XXX)→DevPhone2(1.6)では要"portrait"設定。X06HT(Desire,2.1)では不要or"landscape"設定でOK。
  • それぞれorientation設定のlandscapeとportraitをひっくり返すと縦横比のおかしい90度回転のゆがんだプレビューになる。

元ソースの主な変更点は以下の通り。(他API Levelを4(1.6対応)に変更しているため、エラーが出た箇所を軒並みコメントアウトしてます。)

AndroidManifest.xml

        <activity android:name="Hello" android:screenOrientation="portrait" /><!-- check here -->
        <activity android:name="AutoFocus" android:screenOrientation="portrait" /><!-- check here -->
        <activity android:name="Parameters" android:screenOrientation="portrait" /><!-- check here -->
        <activity android:name="Overlay" android:screenOrientation="portrait" /><!-- check here -->

CameraPreview.java

	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		Log.d("TEST", "surfaceChanged");
		if (camera == null) {
			((Activity)context).finish();
		} else {
			camera.stopPreview();
			setPictureFormat(format);
			Log.d("TEST", "width=" + width  + " height=" + height);
			if(width > height)
			{
				setPreviewSize(480, 320);
			}
			else
			{
				// 縦長
				setPreviewSize(480, 320);

				Parameters params = camera.getParameters();
				if(params != null)
				{
					// DevPhone 2 (Android 1.6)では1行必要。
					// X06HT(Desire, Android 2.1)では入れるとおかしくなる。
					// params.set("orientation", "portrait");
					camera.setParameters(params);
				}
			}

コメントする