2016-03-27 4 views
1

Nach dem Drücken der Taste nehmen Sie ein Bild in meinem Android-App, die Kamera stürzt mit der folgenden Fehlermeldung genannt:Kamera wird nach Camera.release verwendet wird() wurde

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) 

Die App wird mit Rhomobile entwickelt 5.4 und der entsprechende Quellcode ist auf GitHub:

Ich verwende Rhomobile 5.4 mit den folgenden SDKs: - minSDK 21 - Android SDK 5.1.1 - Android NDK 10e - Java 7 U80 SDK - Unter OS X

bin ich nicht vertraut mit Android-Entwicklung.

Antwort

1

Das ist wirklich überfällig, aber als ich vor einer Minute ein ähnliches Problem von mir lösen konnte, dachte ich, ich würde zum Vorteil von dir selbst und allen anderen beitragen, die verzweifelt nach Stack suchen.

Wenn Sie also das Gerät drehen, rufen Sie onPause und onDestroy auf, wo Sie Ihre Kamera freigeben. Ich habe bemerkt, dass Sie camera.open() in Ihrem onResume haben, ohne einen Blick auf Ihren Oberflächencode zu werfen, den ich nicht kommentieren kann. Heres, was für mich funktioniert hat.

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

Als nächstes wird die 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; 
    } 
} 
Verwandte Themen