自動クロススクリーン、スライドカバー(サイドスライド)携帯電話のカメラ設定問題(preViewブラックスクリーン)
コンパイル環境:sdk 2.1,sdk 2.2,sdk 2.3
テストマシン:moto cliq、システムバージョン2.1
今日、camera demoをテストしたとき、プログラムを起動した後、サイドスライドキーボードを閉じるときにpreView画像があり、キーボードを開くとブラックスクリーン(またはキーボードを開くと画像があり、ブラックスクリーンを閉じる)があり、いずれにしてもpreView画像が1つしかないという問題に遭遇しました.自動横画面を開いた携帯電話にもこの問題があります.
プログラムコードは次のとおりです.
手順上、不合理な点はほとんど見えません.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であることがわかりました.問題はここですプログラムは
画面サイズを取得して設定すると、キーボードをスイッチするたびに画面サイズが変化しますが、実際にはcamera parameterで必要な画面サイズは480 X 320で、キーボードをオンにしてもキーディスクをオンにしても、このパラメータは画面の方向によって変化しません.したがって,取得した値が変化するたびに,かえってこのエラーが発生する.
私はプログラムで、65行と68行の値を再設定してから、大成功~そしてこのpreviewSizeの設定はスクリーンサイズでなければならず、surfaceViewのサイズでプレビューウィンドウのサイズを制御します.
しかし、もう1つの新しいケースでは、キーディスクのときにプレビュー画像が90度回転して引き伸ばされることがあります.この問題の参考:
http://blog.163.com/hongwei_benbear/blog/static/1183952912011797180426/
でもなんといっても、一番簡単な方法はスクリーンの方向をロックすることです...
テストマシン: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/
でもなんといっても、一番簡単な方法はスクリーンの方向をロックすることです...