自动横屏、滑盖(侧滑)手机的Camera相机设置问题(preView黑屏)

来源:互联网 发布:java代码混淆工具下载 编辑:程序博客网 时间:2024/04/26 15:08

编译环境:sdk 2.1 , sdk 2.2 , sdk 2.3

测试机器:moto cliq ,系统版本 2.1


    今天在测试一个camera demo的时候遇到了这样的问题:启动程序后,在关闭侧滑键盘的时候有preView图像,打开键盘后黑屏(或者打开键盘有图像,关闭黑屏),反正只能在一个情况下有preView图像。开启了自动横屏的手机上也有这个问题。


    程序代码如下:

public class CaptureImage extends Activity{SurfaceView sView;SurfaceHolder surfaceHolder;int screenWidth, screenHeight;Camera camera;boolean isPreview = false;    @Overridepublic 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(){@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height){}@Overridepublic void surfaceCreated(SurfaceHolder holder){initCamera();}@Overridepublic 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)


    重点是上面加粗放大的几句,让我百思不得其解的是,我手机的屏幕明明是320X480的,这个参数怎么会不对呢?


    然后我尝试把代码65行和68行的height和width参数换了一个位置,发现和之前情况刚好相反,关闭键盘有图像了,打开键盘没了。说明确实是这个参数的问题。开键盘和关键盘的时候,屏幕的分辨率会变化。所以出现这样的错误。


    但是屏幕的height和width都是通过activity里onCreate函数获取的系统环境,而我以前测试过,每次开关键盘的时候,整个activity是会被重新绘制,重新调用onCreate的,获取的参数也会变化的,如果关键盘的时候,用当前宽和高来设置是正确的,那么开键盘之后,调用onCreate,获取新的宽和高,也应该不会错才对。


    测试发现,在开键盘情况下,我的屏幕是 320X480 ,关键盘的情况下,我的屏幕是 480X320 。问题就在这里,程序是通过

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();

    来获取屏幕尺寸并且设置的,在每次开关键盘的时候,屏幕尺寸会变化,但是实际上在camera parameter中需要的屏幕尺寸一直都是 480X320 ,不管开键盘还是关键盘,这个参数不会根据屏幕的方向来变化。所以每次获取的值变化之后,反而会出现这个错误。


    我在程序中,将65和68行的值重新设定后,就大功告成了~并且这个previewSize的设置必须是屏幕大小才行,通过surfaceView的大小来控制预览窗口的大小。


    但是又有一个新的情况,在关键盘的时候,预览图像会旋转90度并且被拉伸,这个问题参考:

    http://blog.163.com/hongwei_benbear/blog/static/1183952912011797180426/


    不过不管怎么说,最简单的方法都是锁定屏幕方向。。。。。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 练瑜伽大腿外侧扭筋了怎么办 膝盖运动时疼痛睡觉不疼怎么办 在农村里床上老是有小蜈蚣该怎么办 瑜伽垫晒太阳后散发的甲醛怎么办 杯子盖上的皮垫子掉了漏水怎么办 20个月宝宝天天晚上不睡觉怎么办 八个月大小孩天天晚上不睡觉怎么办 如果开了光的貔貅不要了要怎么办 刚岀生的婴儿长得太快怎么办 呼市去办牌照时没有牌照怎么办 宾馆发现隐藏的摄像头怎么办报警吗 拍拍贷律师函寄到家里了怎么办 欠了拍拍贷本息一万多了怎么办 把人偷小孩的人贩子打死了怎么办 怀孕3个月没有胎心怎么办 社保局打印关系转移信封之后怎么办 长裙变装外出被发现了怎么办 超变陀螺怎么绳子拉不出来怎么办 梦幻诛仙传说时间得不到东西怎么办 夹在强势母亲和强势老公中间怎么办 工作调动校长总拖着不盖章怎么办 宝贝在妈妈肚子里发育慢怎么办 领导安排你负责一次讲座你怎么办 雷蛇北海巨妖耳机有回音怎么办 手机直播声卡有杂音有回音怎么办 大班见到陌生人入园怎么办安全教案 两首歌合并到一起中间有停顿怎么办 想做主持人但不是播音专业怎么办 动脉造影术2天后穿刺点出血怎么办 战舰世界买了重复金币船怎么办 戒指戴在手上取不下来怎么办 工作中难以和同事上司相处怎么办 老是被上司和同事欺负我该怎么办 桌面太低座位太高写字不舒服怎么办 一个人如果欠下网贷无法偿还怎么办 c语言的编译和运行不见了怎么办 8k纸的国庆节手抄报怎么办 合同员工签字了老板一直未签怎么办 下体长毛了很多肉芽很痒怎么办 对方拟把假离婚协议弄假成真怎么办 领主之塔改版后旧材料怎么办