Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
Java 在release()照相机错误后调用的方法?_Java_Android - Fatal编程技术网

Java 在release()照相机错误后调用的方法?

Java 在release()照相机错误后调用的方法?,java,android,Java,Android,我正在制作一个用于打开/关闭手机led的应用程序我可以理解我做错了什么我遇到了这个错误 E/AndroidRuntime: FATAL EXCEPTION: Thread-42530 java.lang.RuntimeException: Method called after release() at android.hardware.Camera.startPreview(Native Method) at com.mashi.flashlight.FlashLightCal

我正在制作一个用于打开/关闭手机led的应用程序我可以理解我做错了什么我遇到了这个错误

E/AndroidRuntime: FATAL EXCEPTION: Thread-42530
java.lang.RuntimeException: Method called after release()
    at android.hardware.Camera.startPreview(Native Method)
    at com.mashi.flashlight.FlashLightCallingService.flashOn(FlashLightCallingService.java:104)
    at com.mashi.flashlight.FlashLightCallingService$1.run(FlashLightCallingService.java:45)
    at java.lang.Thread.run(Thread.java:856)
我的代码是

public class FlashLightCallingService extends Service {

    Boolean hasFlash;
    Boolean isFlashOn=true ;
    Camera camera;
    Camera.Parameters parameters;


    @Override
    public void onCreate() {

        hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {


        getCamera();
        if (hasFlash)
        {
                new Thread(new Runnable(){
                    public void run() {
                        // TODO Auto-generated method stub
                        while(isFlashOn)
                        {
                            flashOn();
                            //flashOff();
                        }

                    }
                }).start();
        }
        else
        {
            System.exit(1);
        }
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();

        isFlashOn=false;
        if (camera != null) {
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    public void getCamera(){

        if (camera==null)
        {
            try {
                camera=Camera.open();
                parameters=camera.getParameters();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }


    public void flashOn(){
            parameters = camera.getParameters();
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(parameters);
            camera.startPreview();
    }

    public void flashOff(){
            parameters = camera.getParameters();
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(parameters);
            camera.stopPreview();

    }


}

抱歉,语言不是英语,但英语不是我的语言

您有一个线程在服务被破坏后继续运行。在服务完成onDestroy()回调后,线程正在调用camera对象上的方法

至少你应该确保你的线程在服务被破坏时停止,并且在它被释放后不能再调用摄像机上的方法

此外,在Android应用程序中,您永远不应该有这样做的理由:

        System.exit(1);

你能帮我怎么做吗?因为在我的destroy中我有“isFlashOn=false”,所以在这一刻循环将正确停止?如果你在两个不同的线程之间访问一个值,你将必须同步访问该值,或者你可以有一个争用条件。在Java中,线程不会立即看到彼此的更改。因此,请建议您如何处理任何示例代码,因为我在Java中是新手,如果您可以感谢的话,我只使用了ansynctask,并且更适合于此代码,或者在我设置isFlashOn=false do thread.sleep(250)和其他内容之后,将线程放入if循环if(isFlashOn)中我已经做到了这一点,为我工作得很出色,也许有人也有像我一样的问题