在我的 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上:
- 卡姆拉活动:https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraActivity.java https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraActivity.java
- 相机对象:https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraObject.java https://github.com/rhomobile/rhodes/blob/5-4-stable/lib/commonAPI/mediacapture/ext/platform/android/src/com/rho/camera/CameraObject.java
我使用 Rhomobile 5.4 和以下 SDK:
- 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) {
}
}
接下来,相机活动
@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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)