java - 调用 Camera.release() 后相机正在被使用

标签 java android android-ndk android-camera rhomobile

在我的 Android 应用中按下拍照按钮后,相机崩溃并显示以下错误消息:

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)

该应用程序使用 Rhomobile 5.4 开发,相关源代码位于 GitHub 上:

我正在使用带有以下 SDK 的 Rhomobile 5.4: - minSDK 21 - Android SDK 5.1.1 - 安卓NDK 10e - Java 7 u80 SDK - 在 OS X 上

我不熟悉Android开发。

最佳答案

这确实是迟到的事情,但当我一分钟前设法解决了我的类似问题时,我想我会为你自己和其他可能拼命搜索 Stack 的人的利益做出贡献。

因此,当您旋转设备时,您将调用 onPause 和 onDestroy,从而释放相机。我注意到你的 onResume 中确实有camera.open(),如果不查看与表面相关的代码,我无法发表评论。这对我有用。

首先是相机预览

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) {
}
}

接下来,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;
    }
}

关于java - 调用 Camera.release() 后相机正在被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36251691/

相关文章:

java - 随机数测试(直方图)

java - Intent 调用期间充气机错误

android - Android 的谷歌分析忽略 setDebug

android - 如何将现有的 .so 库添加到 Android Studio 项目中?

java - Java 中 System.out 和 System.err 之间的竞争

Java Android 在 FrameLayout 中创建 View

java - 在从 json url 加载 listview 之前,在应用 getFilter() 时在 onQueryTextChange() 处给出错误

java - 在 Java 中使用 C++ ".lib"文件

android - GetFieldID 在 Android 4.4 及更早版本上失败

java - Java Array 类名的格式是什么?