Android 锁定屏幕并返回时摄像机不工作
Android 锁定屏幕并返回时摄像机不工作,android,android-camera,Android,Android Camera,我正在开发一个应用程序,它可以打开flash预览图像数据,完成后关闭flash public void openFlash() { try { flash =false; previewing=false; finger_placed=false; Log.d("", "openFlash"); if(camera==null){ camera = application.getCa
我正在开发一个应用程序,它可以打开flash预览图像数据,完成后关闭flash
public void openFlash() {
try {
flash =false;
previewing=false;
finger_placed=false;
Log.d("", "openFlash");
if(camera==null){
camera = application.getCamera();
preview = Dashboard.preview;
previewHolder = Dashboard.previewHolder;
}
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.setPreviewDisplay(previewHolder);
camera.setPreviewCallback(previewCallback);
camera.startPreview();
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t);
}
}
public void stopPreview() {
try{
Log.d("", "stopPreview");
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
previewing=false;
}catch (Exception e) {
e.printStackTrace();
}
}
一切正常,直到我锁定屏幕。当我解锁屏幕并使用应用程序时。openFlash不起作用。并给出如下误差
06-20 12:13:25.725: E/AndroidRuntime(29033): FATAL EXCEPTION: main
06-20 12:13:25.725: E/AndroidRuntime(29033): java.lang.RuntimeException: Method called after release()
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.hardware.Camera.setHasPreviewCallback(Native Method)
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.hardware.Camera.access$600(Camera.java:133)
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:805)
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.os.Looper.loop(Looper.java:137)
06-20 12:13:25.725: E/AndroidRuntime(29033): at android.app.ActivityThread.main(ActivityThread.java:4898)
06-20 12:13:25.725: E/AndroidRuntime(29033): at java.lang.reflect.Method.invokeNative(Native Method)
06-20 12:13:25.725: E/AndroidRuntime(29033): at java.lang.reflect.Method.invoke(Method.java:511)
06-20 12:13:25.725: E/AndroidRuntime(29033): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
06-20 12:13:25.725: E/AndroidRuntime(29033): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
06-20 12:13:25.725: E/AndroidRuntime(29033): at dalvik.system.NativeStart.main(Native Method)
有没有人遇到过这种情况。感谢您的帮助。其中一种方法是,您可以在应用程序运行时获得唤醒锁,以确保android设备不会被锁定。要做到这一点,只需添加权限:-
<uses-permission android:name="android.permission.WAKE_LOCK" />
在onResume()中时:-
在onPause()中添加以下内容:-
wl.release();
或者更确切地说,另一种方法是:-
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
您是否在清单文件中定义了有关照相机和闪光灯的权限。 例子: android:name=“android.permission.FLASHLIGHT” android:permissionGroup=“android.permissionGroup.HARDWARE\u控件” 如果确定这一点,请检查相机对象在StopReview()后是否已释放。 例子: _camera.stopPreview();
_相机。释放() 您不应该设置唤醒锁,因为您将耗尽设备电池,除非您试图阻止设备暂停。但你似乎不是。我看不到您的生命周期事件(onCreate、onPause等),但我敢打赌您正在onCreate中打开相机,并在onPause中释放它,屏幕锁定后会调用它。但是当你解锁屏幕时,你的应用程序可能还没有被销毁,所以会立即调用Resume;意味着你永远不会重新打开相机。在没有看到任何其他代码的情况下,我将开始查看在活动的onPause()中打开和释放摄影机的位置,您需要在摄影机对象上调用release(),在onResume中,您需要分别在其上调用open() 发件人: 重要提示:调用release()以释放相机供其他应用程序使用。应用程序应在onPause()中立即释放相机(并在onResume()中重新打开它) 我大声说了出来。
需要处理生命周期事件以打开和释放摄像头并设置相应的参数唤醒锁定不会解决任何问题,一旦用户离开并返回应用程序,它将再次崩溃。你是对的,我正在使用camera.open()onCreate方法,但我不会在onPause中释放相机,还有一件事是,当我使用fragment来完成任务时,所有相机代码都在活动本身中。我正在onDestroy()中释放相机。我的理解是,由于活动不调用屏幕锁上的onDestroy,所以不应释放摄像头。但事实并非如此。您可能希望在onDestroy方法中放入一条log语句,以确保不会调用它,因为您的错误输出表明相机已释放,但看起来您正在尝试在释放后设置预览曲面,这就是它抱怨的原因。你真的无法控制系统何时会破坏你的应用程序以回收内存。
wl.release();
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);