自動クロススクリーン、スライドカバー(サイドスライド)携帯電話のカメラ設定問題(preViewブラックスクリーン)


コンパイル環境:sdk 2.1,sdk 2.2,sdk 2.3
テストマシン:moto cliq、システムバージョン2.1
今日、camera demoをテストしたとき、プログラムを起動した後、サイドスライドキーボードを閉じるときにpreView画像があり、キーボードを開くとブラックスクリーン(またはキーボードを開くと画像があり、ブラックスクリーンを閉じる)があり、いずれにしてもpreView画像が1つしかないという問題に遭遇しました.自動横画面を開いた携帯電話にもこの問題があります.
プログラムコードは次のとおりです.
public class CaptureImage extends Activity
{
	SurfaceView sView;
	SurfaceHolder surfaceHolder;
	int screenWidth, screenHeight;
	Camera camera;
	boolean isPreview = false;
    @Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
			WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);
		WindowManager wm = (WindowManager) getSystemService(
			Context.WINDOW_SERVICE);
		Display display = wm.getDefaultDisplay();
		screenWidth = display.getWidth();
		screenHeight = display.getHeight();
		sView = (SurfaceView) findViewById(R.id.sView);
		surfaceHolder = sView.getHolder();
		surfaceHolder.addCallback(new Callback()
		{
			@Override
			public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height)
			{
			}
			@Override
			public void surfaceCreated(SurfaceHolder holder)
			{
				initCamera();
			}
			@Override
			public void surfaceDestroyed(SurfaceHolder holder)
			{
				if (camera != null)
				{
					if (isPreview)
						camera.stopPreview();
					camera.release();
					camera = null;
				}
			}		
		});
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	private void initCamera()
	{
		if (!isPreview)
		{
			camera = Camera.open();
		}
		if (camera != null && !isPreview)
		{
			try
			{
				Camera.Parameters parameters = camera.getParameters();
				

				
				parameters.setJpegQuality(85);
				parameters.setPreviewSize( screenWidth,screenHeight  );
				parameters.setPreviewFrameRate(4);
				parameters.setPictureFormat(PixelFormat.JPEG);
				parameters.setPictureSize( screenWidth,screenHeight  );
				
				camera.setParameters(parameters);
				camera.setPreviewDisplay(surfaceHolder);
				camera.startPreview();
				camera.autoFocus(null);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			isPreview = true;
		}
	}
	
}

手順上、不合理な点はほとんど見えません.Logcatは次のように提示します.
08-29 14:55:11.592: ERROR/CameraSettings(187): Param type 6 not supported 08-29 14:55:11.592: ERROR/CameraSettings(187): Param type 7 not supported 08-29 14:55:11.592: ERROR/CameraSettings(187): Param type 6 not supported 08-29 14:55:11.592: ERROR/CameraSettings(187): Param type 7 not supported 08-29 14:55:12.712: ERROR/CameraSettings(187): Failed substring capabilities check, unsupported parameter 320x480 08-29 14:55:12.722: ERROR/CameraSettings(187): Invalid parameter! 08-29 14:55:12.722: ERROR/QualcommCameraHardware(187): setParameters: X (FAILED) 08-29 14:55:12.722: WARN/System.err(3686): java.lang.RuntimeException: setParameters failed 08-29 14:55:12.732: WARN/System.err(3686):     at android.hardware.Camera.native_setParameters(Native Method) 08-29 14:55:12.732: WARN/System.err(3686):     at android.hardware.Camera.setParameters(Camera.java:652) 08-29 14:55:12.732: WARN/System.err(3686):     at org.crazyit.sound.CaptureImage.initCamera(CaptureImage.java:128) 08-29 14:55:12.742: WARN/System.err(3686):     at org.crazyit.sound.CaptureImage.access$0(CaptureImage.java:100) 08-29 14:55:12.742: WARN/System.err(3686):     at org.crazyit.sound.CaptureImage$2.surfaceCreated(CaptureImage.java:81) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.SurfaceView.updateWindow(SurfaceView.java:454) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:287) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.ViewGroup.drawChild(ViewGroup.java:1532) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1261) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.ViewGroup.drawChild(ViewGroup.java:1532) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1261) 08-29 14:55:12.742: WARN/System.err(3686):     at android.view.View.draw(View.java:6539) 08-29 14:55:12.752: WARN/System.err(3686):     at android.widget.FrameLayout.draw(FrameLayout.java:352) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.ViewGroup.drawChild(ViewGroup.java:1534) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1261) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.View.draw(View.java:6539) 08-29 14:55:12.752: WARN/System.err(3686):     at android.widget.FrameLayout.draw(FrameLayout.java:352) 08-29 14:55:12.752: WARN/System.err(3686):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1883) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.ViewRoot.draw(ViewRoot.java:1363) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1122) 08-29 14:55:12.752: WARN/System.err(3686):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1653) 08-29 14:55:12.752: WARN/System.err(3686):     at android.os.Handler.dispatchMessage(Handler.java:99) 08-29 14:55:12.752: WARN/System.err(3686):     at android.os.Looper.loop(Looper.java:130) 08-29 14:55:12.752: WARN/System.err(3686):     at android.app.ActivityThread.main(ActivityThread.java:4425) 08-29 14:55:12.752: WARN/System.err(3686):     at java.lang.reflect.Method.invokeNative(Native Method) 08-29 14:55:12.762: WARN/System.err(3686):     at java.lang.reflect.Method.invoke(Method.java:521) 08-29 14:55:12.762: WARN/System.err(3686):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 08-29 14:55:12.762: WARN/System.err(3686):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 08-29 14:55:12.762: WARN/System.err(3686):     at dalvik.system.NativeStart.main(Native Method)
ポイントは上に太く拡大したいくつかの文で、私に理解できないのは、私の携帯電話の画面は320 X 480なのに、このパラメータはどうして間違っているのだろうか.
それからコード65行と68行のheightとwidthパラメータを位置を変えてみましたが、前の状況とは正反対で、キーボードを閉じて画像があり、キーボードを開けていません.説明は確かにこのパラメータの問題です.キーボードとキーをつけると画面の解像度が変わります.だからこのような間違いが発生しました.
しかし、画面のheightとwidthはactivityのonCreate関数で取得したシステム環境ですが、私は以前テストしたことがあります.キーボードをスイッチするたびに、activity全体が再描画され、onCreateが再呼び出され、取得したパラメータも変化します.キーボードをオフにするときは、現在の幅と高さで設定が正しい場合は、キーボードをオンにした後、onCreateを呼び出し、新しい幅と高さを取得します.間違いないはずだ.
テストでは、キーボードをつけた場合、私の画面は320 X 480で、キーディスクの場合、私の画面は480 X 320であることがわかりました.問題はここですプログラムは
WindowManager wm = (WindowManager) getSystemService(
		Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

画面サイズを取得して設定すると、キーボードをスイッチするたびに画面サイズが変化しますが、実際にはcamera parameterで必要な画面サイズは480 X 320で、キーボードをオンにしてもキーディスクをオンにしても、このパラメータは画面の方向によって変化しません.したがって,取得した値が変化するたびに,かえってこのエラーが発生する.
私はプログラムで、65行と68行の値を再設定してから、大成功~そしてこのpreviewSizeの設定はスクリーンサイズでなければならず、surfaceViewのサイズでプレビューウィンドウのサイズを制御します.
しかし、もう1つの新しいケースでは、キーディスクのときにプレビュー画像が90度回転して引き伸ばされることがあります.この問題の参考:
    http://blog.163.com/hongwei_benbear/blog/static/1183952912011797180426/
でもなんといっても、一番簡単な方法はスクリーンの方向をロックすることです...