2


我正在开发一个应用程序,该应用程序打开 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)

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

4

5 回答 5

1

在您的活动的 onPause() 中,您需要在 Camera 对象上调用 release(),在 onResume 中,您需要分别在其上调用 open()。

API 参考

重要提示:调用 release() 以释放相机以供其他应用程序使用。应用程序应立即在 onPause() 中释放相机(并在 onResume() 中重新打开()它)。

于 2013-06-25T08:30:37.650 回答
1

我发现了它。需要处理生命周期事件来打开和释放相机并设置相应的参数

于 2013-07-08T08:01:07.503 回答
0

您是否在清单文件中定义了有关相机和闪光灯的权限。例如: android:name="android.permission.FLASHLIGHT" android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" 如果您确定这一点,请检查您的相机对象是否在 stopPreview() 之后释放。示例:_camera.stopPreview(); _camera.release();

于 2013-06-25T08:14:19.237 回答
0

您不应该设置唤醒锁定,因为您会烧毁设备电池,除非您试图阻止设备挂起。它看起来不像你。我看不到您的生命周期事件(onCreate、onPause 等),但我敢打赌您在 onCreate 中打开相机并在 onPause 中释放它,这将在屏幕锁定后调用。但是当你解锁屏幕时,你的应用可能还没有被销毁,所以 onResume 会立即被调用;这意味着您永远不会重新打开相机。在没有看到您的任何其他代码的情况下,我会开始查看您打开并释放相机的位置

于 2013-06-25T08:18:49.553 回答
-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);
于 2013-06-25T08:04:27.073 回答