我正在开发一个应用程序,它打开闪光灯预览图像数据,完成后关闭闪光灯。
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)
有没有人遇到过这种情况。任何帮助将不胜感激。
答案 0 :(得分:1)
在你的活动的onPause()中,你需要在你的Camera对象和你的onResume上调用release(),你需要分别调用它上面的open()。
重要事项:调用release()以释放相机以供其他应用程序使用。应用程序应立即在onPause()中释放相机(并在onResume()中重新打开())。
答案 1 :(得分:1)
我把它弄出来了。 需要处理生命周期事件以打开和释放摄像头和setRespective参数
答案 2 :(得分:0)
您是否在清单文件中定义了有关摄像头和闪光灯的权限。 例: 机器人:名字= “android.permission.FLASHLIGHT” 机器人:permissionGroup = “android.permission-group.HARDWARE_CONTROLS” 如果您确定这一点,请检查您的相机对象是否在stopPreview()之后释放。 例: _camera.stopPreview(); _camera.release();
答案 3 :(得分:0)
您不应该设置唤醒锁定,因为您将烧毁设备电池,除非您试图阻止设备暂停。它看起来不像你。我无法看到你的生命周期事件(onCreate,onPause等),但我敢打赌你在onCreate中打开相机并在onPause中释放它,这将在屏幕锁定后调用。但是当你解锁屏幕时,你的应用程序可能还没有被销毁,所以onResume立即被调用;这意味着你永远不会重新打开相机。在没有看到任何其他代码的情况下,我会开始查看您打开的位置并释放相机
答案 4 :(得分:-1)
其中一种方法是您可以在应用程序运行时获取唤醒锁定,以确保Android设备永远不会被锁定。要执行此操作只需添加权限: -
<uses-permission android:name="android.permission.WAKE_LOCK" />
清单中的以及应用程序启动后立即在onCreate()中添加: -
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
在onResume()中: -
wl.acquire();
并在onPause()中添加: -
wl.release();
或者更确切地说,另一种方法是: -
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);