even when timer has stopped timer2 and timer3 are still running and haven't cancelled. Add this
timer2.cancel();
timer3.cancel();
where there is
timer.cancel();
EDIT
I would just go with one timer like so:
put this as a field on the class
private boolean running = false;
private Timer timer = new Timer();
then this code in the method
boolean on = false;
final Camera.Parameters p = camera.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
if(!running)
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(on) {
on = false;
p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
}
else {
on = true;
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
}
}
}, 1*1000, 2*1000);
}
else {
timer.cancel();
}