Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 锁定屏幕并返回时摄像机不工作_Android_Android Camera - Fatal编程技术网

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);