魅族 mx2拍照无反应 Camera.takePicture 未回调PictureCallback jpeg

要在Android中调用相机功能,一是调用系统相机,二是利用Camera与SurfaceView进行处理。而我的问题是使用第二种方法,拍照时系统无反应,具体描述如下:
现象描述:
魅族mx2上,点击拍照,没有反应!!
魅族MX2明明我是测试过可以用的,但是第二天同事测得时候发现了这个问题,思来想去的找不到办法,这到底是什么原因呢,我把工程clean了好几遍,程序也卸载了重装仍然不见效。之后只有代码调试了,发现在调用mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);方法进行拍照后,系统竟未调用jpegCallback回调方法。这是为什么呢?
原因分析:
因为一部分手机(如:note2)在拍照后,SurfaceView很快就回到了预览状态,这和手机系统有关,我想让相机拍照后,将图片显示在SurfaceView上,也就是让SurfaceView停止预览。于是就将拍照所得的图片设置成SurfaceView的背景,这样就达到了效果。但是这样一来就出现了一个问题,预览图与设置为背景的图片,有些变形。为了使预览图不变形,将PictureSize与PreviewSize的值设置为相同相同的值,但是设置的PictureSize是不被其支持的Size,因此造成了拍照后不调用此回调方法的bug。
解决方法:
获取受支持的Size进行设置,方法如下:
[java]  view plain copy
  1.     /* 相机初始化的method */  
  2.     private void initCamera() {  
  3.         if (mCamera != null) {  
  4.             try {  
  5.                 Camera.Parameters parameters = mCamera.getParameters();  
  6.                 parameters.setPictureFormat(PixelFormat.JPEG);  
  7.                 //设置被支持的预览界面与图片的size  
  8.                 List<size> previewSizes = parameters.getSupportedPreviewSizes();  
  9.                   
  10.                 Size size = getCurrentScreenSize(previewSizes, 1);  
  11.                 parameters.setPreviewSize(size.width, size.height);  
  12.                   
  13. //          这里就是错误的所在,因为设置的size不一定是PictureSize所支持的  
  14. //          parameters.setPictureSize(size.width, size.height);  
  15.   
  16.   
  17.                 List<size> pictureSizes = parameters.getSupportedPictureSizes();  
  18.                 Size size2 = getCurrentScreenSize(pictureSizes, 1);  
  19.                 parameters.setPictureSize(size2.width, size2.height);  
  20.   
  21.   
  22.                 mCamera.setParameters(parameters);  
  23.   
  24.   
  25.                 /* 开启预览画面 */  
  26.                 mCamera.startPreview();  
  27.   
  28.   
  29.             } catch (Exception e) {  
  30.                 e.printStackTrace();  
  31.             }  
  32.             mAutoFocusCallback.setHandler(mainHandler, 1);  
  33.             try {  
  34.                 mCamera.autoFocus(mAutoFocusCallback);  
  35.             } catch (Exception exception) {  
  36.                 exception.printStackTrace();  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.   
  42.     /** 
  43.      * 获得最接近频幕宽度的尺寸 
  44.      *  
  45.      * @param sizeList 
  46.      * @param n 
  47.      *            放大几倍 (>0) 
  48.      * @return 
  49.      */  
  50.     private Size getCurrentScreenSize(List<size> sizeList, int n) {  
  51.         if (sizeList != null && sizeList.size() > 0) {  
  52.             int screenWidth = ViewUtil.getScreenWidth(this) * n;  
  53.             int[] arry = new int[sizeList.size()];  
  54.             int temp = 0;  
  55.             for (Size size : sizeList) {  
  56.                 arry[temp++] = Math.abs(size.width - screenWidth);  
  57.             }  
  58.             temp = 0;  
  59.             int index = 0;  
  60.             for (int i = 0; i < arry.length; i++) {  
  61.                 if (i == 0) {  
  62.                     temp = arry[i];  
  63.                     index = 0;  
  64.                 } else {  
  65.                     if (arry[i] < temp) {  
  66.                         index = i;  
  67.                         temp = arry[i];  
  68.                     }  
  69.                 }  
  70.             }  
  71.             return sizeList.get(index);  
  72.         }  
  73.         return null;  
  74.     }  
  75. </size></size></size>  


总结:
也许其他型号的手机也会出现这样的问题,不出现问题只不过是碰巧设置的PictureSize与PreviewSize是两个都支持的Size而已。

为了修改一个错误,而造成另外一个错误,大概是每个程序员都会犯的错。这不仅仅是因为自己对API的理解的不够透彻,而且是一个人的态度问题,以后要多加认真才是。


http://blog.csdn.net/wangfayinn/article/details/9319161



你可能感兴趣的:(魅族 mx2拍照无反应 Camera.takePicture 未回调PictureCallback jpeg)