2016-03-27 22 views
1

と呼ばれていた、次のエラーメッセージでカメラクラッシュ:カメラ(Camera.release後に使用されているが)、私の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 - AndroidのNDK 10E - Javaの7のU80のSDK - OS X

に私が慣れていないんですよAndroid開発で

答えて

1

これは本当に遅れていますが、私は1分前に​​私の同様の問題を解決することができたので、自分自身や他の誰かが必死にスタックを探している人の利益のために貢献すると思いました。

したがって、デバイスを回転させると、カメラを放しているonPauseとonDestroyが呼び出されます。 onResumeでcamera.open()を使用していることに気付きました。私はコメントできないサーフェス関連のコードを見ていません。私のために働いたものをheres。

まず、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) { 
} 
} 

次に、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; 
    } 
} 
関連する問題