Камера Android: включение / выключение вспышки камеры - сбой приложения при повороте устройства

У меня есть простое приложение с button включить / выключить camera flash:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.btnFlash);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if(!isLight)
                {
                    switchON();
                }
                else
                {
                    switchOFF();
                }
            }
        });
    }

Если вспышка была выключена, она включится, а в противном случае выключится. Да, это работает хорошо. Проблема в том, что: - Во-первых, я нажал button чтобы включить, после этого я поворачиваю свое устройство и затем снова нажимаю, чтобы выключить -> Сбой приложения.

Неустранимое исключение: основное - исключение времени выполнения: не удается подключиться к службе камеры

Это 2 функции для включения / выключения

public void switchON()
    {
        camera = Camera.open();
        Parameters p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        camera.startPreview();
        isLight = true;
    }

    public void switchOFF()
    {
        Parameters p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
        camera.release();
        isLight = false;
    }

2 ответа

Попробуйте это (я переписал код):

public class YourClass extends Activity {

    private Button button;
    private Camera camera;
    private boolean isLight=false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button)findViewById(R.id.btnFlash);
        button.setOnClickListener(new OnClickListener() {

         @Override
            public void onClick(View v) {
                if(!isLight)
                {
                    switchON();
                }
                else
                {
                    switchOFF();
                }
            }
        });


   }

    @Override
    protected void onResume() {
        super.onResume();
        try{
            camera = Camera.open();
        } catch( Exception e ){
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        if( camera != null ){
            camera.release();
            camera = null;
        }
        super.onPause();
    }

    private void switchOFF(){
        if( mCamera != null ){
            Parameters p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        isLight = false;
        }
    }

    private void switchON(){
        if( mCamera != null ){
            Parameters p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        isLight=true;
        }
    }
}

Пытаться:

 public void switchOFF()
    {

    if(camera == null)
    {
        camera = Camera.open();
    }
        Parameters p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
        camera.release();
        isLight = false;
    }
Другие вопросы по тегам