0

I have a problem and I didn't see any solution.

I've created an "SOS" application which tries to blink the flashlight in user's phone.

I create some logic and this work like

  • When I click button flash just startPreview after 2 sec (see: int mInterval = 2000;)

  • I create boolean flag, isFlashOn, but this not work and I don't know why.

Please take a 3 minutes to look at code, maybe u will see what is bad here.

    public class SOSFragment extends Fragment {

    private Context context;
    private int mInterval = 2000;
    private Handler mHandler = new Handler();
    private Runnable mStatusChecker;
    private boolean isFlashOn = false;
    public SOSFragment() {
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

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

    void stopRepeatingTask() {
        mHandler.removeCallbacks(mStatusChecker);
    }

    private void startRepeatingTask() {
        mStatusChecker.run();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_sos, container, false);
        Button btn_exit = (Button) view.findViewById(R.id.btn_exit);
        Button btn_sos = (Button) view.findViewById(R.id.btn_sos);
        ((MainActivity) context).checkCameraPermission();
        btn_exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity) context).closeSOSFragment();
                ((MainActivity) context).showToolbarFragment();
            }
        });
        btn_sos.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startRunnable();
            }
        });
        return view;
    }

    private void startRunnable(){
        mStatusChecker = new Runnable() {
            @Override
            public void run() {
                final Camera cam = Camera.open();
                Camera.Parameters p = cam.getParameters();
                p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                cam.setParameters(p);
                if(!isFlashOn){
                    cam.stopPreview();
                    isFlashOn = true;
                }else {
                    cam.startPreview();
                    isFlashOn = false;
                }

            }
        };
        mHandler.postDelayed(mStatusChecker, mInterval);
        startRepeatingTask();
    }
}
VC.One
  • 14,790
  • 4
  • 25
  • 57
Rodriquez
  • 981
  • 1
  • 7
  • 21
  • Take a look at this question. I haven't coded anything for Android in a while but it might help http://stackoverflow.com/questions/6242268/repeat-a-task-with-a-time-delay – Petar-Krešimir Mar 07 '17 at 21:22

1 Answers1

1

Change:

Runnable startRunnable = new Runnable() {
            public void run() {
                final Camera cam = Camera.open();
                Camera.Parameters p = cam.getParameters();
                p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                cam.setParameters(p);
                if(!isFlashOn){
                    cam.stopPreview();
                    isFlashOn = true;
                }else {
                    cam.startPreview();
                    isFlashOn = false;
                }

            }
        };
        mHandler.postDelayed(this, mInterval);
    }

To start blink

mHandler.post(startRunnable);

To stop blink

mHandler.removeCallbacks(startRunnable);
Grzegorz
  • 841
  • 7
  • 9