锁定屏幕并返回时相机不工作

时间:2013-06-25 07:56:29

标签: android android-camera


我正在开发一个应用程序,它打开闪光灯预览图像数据,完成后关闭闪光灯。

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)

有没有人遇到过这种情况。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

在你的活动的onPause()中,你需要在你的Camera对象和你的onResume上调用release(),你需要分别调用它上面的open()。

来自the API reference

  

重要事项:调用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);