发布后调用的方法()Camera Error?

时间:2016-02-26 20:19:55

标签: 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.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();

    }


}

对不起语言但英语不是我的语言

1 个答案:

答案 0 :(得分:0)

你有一个线程在服务被销毁后继续运行。在服务完成onDestroy()回调之后,线程正在调用相机对象上的方法。

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

此外,您永远不应该有理由在Android应用中执行此操作:

        System.exit(1);