2017-03-07 4 views
0

J'ai un problème et je n'ai vu aucune solution.Mon application SOS ne clignote qu'une seule fois

J'ai créé une application "SOS" qui essaie de faire clignoter la lampe de poche dans le téléphone de l'utilisateur.

Je crée une certaine logique et ce travail comme

  • Lorsque je clique sur le bouton flash juste startPreview après 2 sec (voir int mInterval = 2000;)

  • Je crée booléen, isFlashOn, mais cela fonctionne pas et je ne sais pas pourquoi.

S'il vous plaît prendre un 3 minutes pour regarder le code, peut-être vous verrez ce qui est mauvais ici.

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(); 
    } 
} 
+0

Jetez un oeil à cette question. Je n'ai rien codé pour Android depuis un moment, mais cela pourrait aider http://stackoverflow.com/questions/6242268/repeat-a-task-with-a-time-delay –

Répondre

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); 
    } 

Pour commencer clignement

mHandler.post(startRunnable); 

Pour arrêter clignoter

mHandler.removeCallbacks(startRunnable);