开发者

have to restart phone again to get camera working

Hey guys I am accessing camera through my application. It is all well and i can even save a photo to my sd card but

when i capture the image the application seems to get stucked plus if i go to home and den return to the application again i have a force close error. The following is the error i get in logcat

04-13 17:20:40.818: ERROR/AndroidRuntime(1149): java.lang.RuntimeException: Fail to connect to camera service
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.hardware.Camera.native_setup(Native Method)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.hardware.Camera.<init>(Camera.java:118)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.hardware.Camera.open(Camera.java:91)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at org.mycamera.mycamera.surfaceCreated(mycamera.java:70)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.SurfaceView.updateWindow(SurfaceView.java:540)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.View.draw(View.java:6742)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.View.draw(View.java:6742)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewRoot.draw(ViewRoot.java:1422)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1167)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1744)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.os.Looper.loop(Looper.java:144)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at android.app.ActivityThread.main(ActivityThread.java:4937)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at java.lang.reflect.Method.invoke(Method.java:521)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-13 17:20:40.818: ERROR/AndroidRuntime(1149):     at dalvik.system.NativeStart.main(Native Method)

Following is the code :-

SurfaceHolder holder;
SurfaceView  surface;
Camera camera;
Boolean isPreviewRunning;
//Preview mpreview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    isPreviewRunning = false;
    surface = (SurfaceView)findViewById(R.id.surface);
    holder = surface.getHolder();
  holder.addCallback(this);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  Button btn = (Button)findViewById(R.id.click);
    btn.setOnClickListener(new OnClickListe开发者_JAVA百科ner(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg);
            //onCreate(null);
        }

    });

}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
/*  if (isPreviewRunning) {  
          camera.stopPreview();  
         }  */

    Camera.Parameters parameters = camera.getParameters();

    List<Size> sizes = parameters.getSupportedPreviewSizes();
    Size size = sizes.get(0);
    parameters.setPreviewSize(size.width, size.height);

    camera.setParameters(parameters);
     camera.startPreview();  
     isPreviewRunning=true;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
     camera = Camera.open();
     try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    camera.stopPreview();
    camera.release();
    camera=null;
}

 protected void onRestoreInstanceState(Bundle savedInstanceState)
 {

 super.onRestoreInstanceState(savedInstanceState);
 }

 Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera c) {
  Log.e(getClass().getSimpleName(), "PICTURE CALLBACK RAW: " + data);
  camera.startPreview();
 }
 };

 Camera.PictureCallback mPictureCallbackJpeg= new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera c) {
  Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data);
 }
 };

 Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
 public void onShutter() {
 Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK");
 }
 };

 protected void onResume()
 {

 Log.e(getClass().getSimpleName(), "onResume");
 super.onResume();
 }

 protected void onSaveInstanceState(Bundle outState)
 {
 super.onSaveInstanceState(outState);
 }

 protected void onStop()
 {
 Log.e(getClass().getSimpleName(), "onStop");
 super.onStop();
 }


Most likely, it's because your calling startPreview() again too early. From the SDK documentation on Camera.takePicture():

After calling this method, you must not call startPreview() or take another picture until the JPEG callback has returned.

You are calling startPreview() to restart the preview frames in your mPictureCallbackRaw, when you should wait until the mPictureCallbackJpeg. This is probably messing with the Camera service and putting it into a weird state.

Hope that Helps!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜