Camera is being used after Camera.release() was called

一个人想着一个人 提交于 2019-12-12 20:24:18

问题


After pressing the take a picture button in my Android app, the camera crashes with the following error message:

E 03/21/2016 10:29:49:164 000007d1 CameraObject| Camera is being used after Camera.release() was called
java.lang.RuntimeException: Camera is being used after Camera.release() was called
at android.hardware.Camera._stopPreview(Native Method)
at android.hardware.Camera.stopPreview(Camera.java:730)
at com.rho.camera.CameraObject.stopPreview(CameraObject.java:435)
at com.rho.camera.CameraActivity.onDestroy(CameraActivity.java:131)
at android.app.Activity.performDestroy(Activity.java:6407)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1142)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3818)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849)
at android.app.ActivityThread.-wrap5(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

The app is developed using Rhomobile 5.4 and the relevant source code is on GitHub:

  • CaemraActivity: https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraActivity.java
  • CameraObject: https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraObject.java

I'm using Rhomobile 5.4 with the following SDKs: - minSDK 21 - Android SDK 5.1.1 - Android NDK 10e - Java 7 u80 SDK - On OS X

I'm not familiar with Android development.


回答1:


This is really overdue but as I managed to solve a similar problem of mine a minute ago, I thought I'd contribute for the benefit of yourself and anyone else who might be desperately searching Stack.

So when you rotate the device, you are calling onPause and onDestroy, where you are releasing your camera. I noticed you do have camera.open() in your onResume, without a look at your surface-related code I cannot comment. Heres what worked for me.

Firstly, the cameraPreview

public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
try {
    this.mCamera.setPreviewDisplay(surfaceHolder);
    this.mCamera.startPreview();
} catch (Exception e) {
}
}


public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
    //TODO we need this here too because on SurfaceCreated we always need to open the camera, in case its released

    this.mCamera.setPreviewDisplay(surfaceHolder);
    this.mCamera.setDisplayOrientation(90);
    //this.mCamera.startPreview();
} catch (IOException e) {
}
}

Next, the CameraActivity

@Override
public void onResume() {
    super.onResume();
   try{
       mCamera = openFrontFacingCameraGingerbread();
      // Add to Framelayout
       this.mCameraPreview = new CameraPreview(this, this.mCamera);
        mImage.removeAllViews();
       this.mImage.addView(this.mCameraPreview);

   }catch (RuntimeException ex){

    }



}


@Override
public void onPause() {
    super.onPause();
    captureButton.setText("Begin Capture");
    if(CameraActivity.this.timer !=null) {
        CameraActivity.this.timer.cancel();
        CameraActivity.this.timer.purge();
        CameraActivity.this.timer = null;
    }
    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCameraPreview.getHolder().removeCallback(mCameraPreview);
        mCamera.release();
        mCamera = null;
    }


}


@Override
protected void onDestroy(){
    super.onDestroy();
    releaseCameraAndPreview();
}

private void releaseCameraAndPreview() {

    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
    if(mCameraPreview != null){
        mCameraPreview.destroyDrawingCache();
        mCameraPreview.mCamera = null;
    }
}


来源:https://stackoverflow.com/questions/36251691/camera-is-being-used-after-camera-release-was-called

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!