android Camera 拍照的两个问题

2010.11.16———android Camera 拍照的两个问题 

1、setParameters failed 异常信息如下 

Java代码  收藏代码
  1. 11-16 11:21:33.902: WARN/System.err(27218): java.lang.RuntimeException: setParameters failed  
  2. 11-16 11:21:33.902: WARN/System.err(27218):     at android.hardware.Camera.native_setParameters(Native Method)  
  3. ...  
  4. ...  


原因在于 

Java代码  收藏代码
  1. parameters.setPreviewSize()//设置预览照片的大小  
  2. parameters.setPictureSize()//设置照片的大小  


这两个属性 如果这两个属性设置的和真实手机的不一样时,就会报上面的错误 很是郁闷 

最好的方法 就是 不设置这两项 


2、java.lang.NullPointerException 

Java代码  收藏代码
  1. 11-16 13:33:39.801: ERROR/AndroidRuntime(5676): FATAL EXCEPTION: main  
  2. 11-16 13:33:39.801: ERROR/AndroidRuntime(5676): java.lang.NullPointerException  
  3. 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at com.huitu.project.PicActivity.onKeyDown(PicActivity.java:87)  
  4. 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.view.KeyEvent.dispatch(KeyEvent.java:1257)  
  5. 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.app.Activity.dispatchKeyEvent(Activity.java:2075)  


其实 这个原因 是因为 

Java代码  收藏代码
  1. @Override  
  2.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.         if(event.getRepeatCount()==0 && camera!=null){  
  4.             switch (keyCode) {  
  5.             case KeyEvent.KEYCODE_SEARCH://按下的是搜索键  
  6.                 camera.autoFocus(null);//自动对焦  
  7.                 return true;  
  8.   
  9.             case KeyEvent.KEYCODE_CAMERA:  
  10.             case KeyEvent.KEYCODE_DPAD_CENTER:  
  11.                 camera.takePicture(nullnullnew MyPictureCallback());  
  12.                 Intent data = new Intent();  
  13.                 data.putExtra("picFile", picFile.getAbsolutePath());  
  14.                 setResult(100, data);  
  15.                 finish();  
  16.                 return true;  
  17.             }  
  18.         }  
  19.         return super.onKeyDown(keyCode, event);  
  20.     }  
  21.   
  22. private final class MyPictureCallback implements PictureCallback{  
  23.         private String name = "pic";  
  24.         public void onPictureTaken(byte[] data, Camera camera) {  
  25.               
  26.             try {  
  27.                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
  28.                 picFile = new File(Environment.getExternalStorageDirectory(), name + System.currentTimeMillis()+".jpg");  
  29.                 FileOutputStream outStream = new FileOutputStream(picFile);  
  30.                 bitmap.compress(CompressFormat.JPEG, 100, outStream);  
  31.                 outStream.close();  
  32.                 //camera.startPreview();  
  33.             } catch (Exception e) {  
  34.                 e.printStackTrace();  
  35.             }  
  36.         }  
  37.           
  38.     }  

Java代码  收藏代码
  1. camera.takePicture(nullnullnew MyPictureCallback());  
这个方法是异步执行的 也就是说 

new MyPictureCallback()还没有执行完成, 

Java代码  收藏代码
  1. Intent data = new Intent();  
  2. data.putExtra("picFile", picFile.getAbsolutePath());  
  3. setResult(100, data);  
  4. finish();  

下面的代码就开始执行了 这时候 picFile就是空的 所以就会报空指针异常 

解决方法 把 

Java代码  收藏代码
  1. Intent data = new Intent();  
  2. data.putExtra("picFile", picFile.getAbsolutePath());  
  3. setResult(100, data);  
  4. finish();  
  5.   
  6. 放到MyPictureCallback()里面 最后执行即可  






因为项目中有用到相机拍照功能,所以研究了下camera。
在实践的过程中发现两个问题:
1、用模拟器启动不了camera,提示:java.lang.runtimeException:setparameters failed.....
    因为parameters.setPictureSize(320, 480)(设置分辨率)的参数有误,
    如果不清楚分辨率可以却掉这句话,再运行就OK 了。
    如果真的想看分辨率可以看logcat日志上面有写:getParameters(....)里面就是一些相关的参数。
2、连续两次以上的拍照,会出现异常:java.lang.RuntimeException:fail to connect to camera service。
    因为没有对camera进行释放,或者说系统有自动释放功能但是还没有被处理。可以通过手动释放:
    /**
     * 停止预览
     */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
                mCamera.stopPreview();
               mCamera.release();//加上这句,就OK!
                mCamera=null;
                
        }
posted @ 2012-04-24 20:33  sfshine  阅读(1652)  评论(0编辑  收藏  举报