android Camera 拍照的两个问题

1、setParameters failed 异常信息如下  

  • 11-16 11:21:33.902: WARN/System.err(27218): java.lang.RuntimeException: setParameters failed   

  • 11-16 11:21:33.902: WARN/System.err(27218):     at android.hardware.Camera.native_setParameters(Native Method)   
  • ...   
  • ...  

11-16 11:21:33.902: WARN/System.err(27218): java.lang.RuntimeException: setParameters failed11-16 11:21:33.902: WARN/System.err(27218):     at android.hardware.Camera.native_setParameters(Native Method)......

原因在于 

Java代码 

  • parameters.setPreviewSize()//设置预览照片的大小   
  • parameters.setPictureSize()//设置照片的大小  

parameters.setPreviewSize()//设置预览照片的大小parameters.setPictureSize()//设置照片的大小

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

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


2、java.lang.NullPointerException  

  • 11-16 13:33:39.801: ERROR/AndroidRuntime(5676): FATAL EXCEPTION: main   

  • 11-16 13:33:39.801: ERROR/AndroidRuntime(5676): java.lang.NullPointerException   

  • 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at com.huitu.project.PicActivity.onKeyDown(PicActivity.java:87)   

  • 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.view.KeyEvent.dispatch(KeyEvent.java:1257)   

  • 11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.app.Activity.dispatchKeyEvent(Activity.java:2075)  

11-16 13:33:39.801: ERROR/AndroidRuntime(5676): FATAL EXCEPTION: main11-16 13:33:39.801: ERROR/AndroidRuntime(5676): java.lang.NullPointerException11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at com.huitu.project.PicActivity.onKeyDown(PicActivity.java:87)11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.view.KeyEvent.dispatch(KeyEvent.java:1257)11-16 13:33:39.801: ERROR/AndroidRuntime(5676):     at android.app.Activity.dispatchKeyEvent(Activity.java:2075)

其实 这个原因 是因为 

  • @Override  
  •     public boolean onKeyDown(int keyCode, KeyEvent event) {   
  •         if(event.getRepeatCount()==0 && camera!=null){   
  •             switch (keyCode) {   
  •             case KeyEvent.KEYCODE_SEARCH://按下的是搜索键   
  •                 camera.autoFocus(null);//自动对焦   
  •                 return true;   
  •   
  •             case KeyEvent.KEYCODE_CAMERA:   
  •             case KeyEvent.KEYCODE_DPAD_CENTER:   
  •                 camera.takePicture(nullnullnew MyPictureCallback());   
  •                 Intent data = new Intent();   
  •                 data.putExtra("picFile", picFile.getAbsolutePath());   
  •                 setResult(100, data);   
  •                 finish();   
  •                 return true;   
  •             }   
  •         }   
  •         return super.onKeyDown(keyCode, event);   
  •     }   
  •   

  • private final class MyPictureCallback implements PictureCallback{   
  •         private String name = "pic";   
  •         public void onPictureTaken(byte[] data, Camera camera) {   
  •                
  •             try {   
  •                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);   
  •                 picFile = new File(Environment.getExternalStorageDirectory(), name + System.currentTimeMillis()+".jpg");   
  •                 FileOutputStream outStream = new FileOutputStream(picFile);   
  •                 bitmap.compress(CompressFormat.JPEG, 100, outStream);   
  •                 outStream.close();   
  •                 //camera.startPreview();   
  •             } catch (Exception e) {   
  •                 e.printStackTrace();   
  •             }   
  •         }   
  •            
  •     }  

@Override        public boolean onKeyDown(int keyCode, KeyEvent event) {                if(event.getRepeatCount()==0 && camera!=null){                        switch (keyCode) {                        case KeyEvent.KEYCODE_SEARCH://按下的是搜索键                                camera.autoFocus(null);//自动对焦                                return true;                        case KeyEvent.KEYCODE_CAMERA:                        case KeyEvent.KEYCODE_DPAD_CENTER:                                camera.takePicture(null, null, new MyPictureCallback());                                Intent data = new Intent();                                data.putExtra("picFile", picFile.getAbsolutePath());                                setResult(100, data);                                finish();                                return true;                        }                }                return super.onKeyDown(keyCode, event);        }private final class MyPictureCallback implements PictureCallback{                private String name = "pic";                public void onPictureTaken(byte[] data, Camera camera) {                                                try {                                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);                                picFile = new File(Environment.getExternalStorageDirectory(), name + System.currentTimeMillis()+".jpg");                                FileOutputStream outStream = new FileOutputStream(picFile);                                bitmap.compress(CompressFormat.JPEG, 100, outStream);                                outStream.close();                                //camera.startPreview();                        } catch (Exception e) {                                e.printStackTrace();                        }                }                        }
Java代码 

  • camera.takePicture(nullnullnew MyPictureCallback());  

camera.takePicture(null, null, new MyPictureCallback());这个方法是异步执行的 也就是说 

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



  • Intent data = new Intent();   
  • data.putExtra("picFile", picFile.getAbsolutePath());   
  • setResult(100, data);   
  • finish();  

Intent data = new Intent();data.putExtra("picFile", picFile.getAbsolutePath());setResult(100, data);finish();
下面的代码就开始执行了 这时候 picFile就是空的 所以就会报空指针异常 

解决方法 把 


  • Intent data = new Intent();   
  • data.putExtra("picFile", picFile.getAbsolutePath());   
  • setResult(100, data);   
  • finish();   
  •   
  • 放到MyPictureCallback()里面 最后执行即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值