Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Application crash a l'appuie d'un bouton

    5 mars 2020 à 11:48:11

    Bonjour a tous.

    Je suis nouveau dans le monde de la programmation android et j'essaie de créer une petite application toute simple sur android studio avec 2 bouton image (play et stop) ainsi que 4 boutons toggle. Le but étant que lorsque j'appuie sur play cela joue un son pour chaque bouton toggle a l'état actif, les uns après les autres et en boucle jusqu’à ce que j'appuie sur stop. J'ai donc crée cette classe : 

    public class Sampler {
    
        SoundPool sp;
        private int snareId;
        private Context mycontext;
        public boolean playing;
        public ToggleButton button1, button2, button3, button4;
        public ImageButton playButton, stopButton;
    
    
    
        public Sampler(Context appcontext) {
    
            this.mycontext = appcontext;
    
            sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    
            snareId = sp.load(mycontext, R.raw.snare, 1);
    
    
        }
    
        public void play() {
    
                playing = true;
            while (playing == true) {
                if (button1.isChecked()) {
                    sp.play(snareId, 10, 10, 1, 0, 1);
                    try {
                        Thread.sleep(60000 / (120 * 4));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (button2.isChecked()) {
                        sp.play(snareId, 10, 10, 1, 0, 1);
                        try {
                            Thread.sleep(60000 / (120 * 4));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if (button3.isChecked()) {
                            sp.play(snareId, 10, 10, 1, 0, 1);
                            try {
                                Thread.sleep(60000 / (120 * 4));
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            if (button4.isChecked()) {
                                sp.play(snareId, 10, 10, 1, 0, 1);
                                try {
                                    Thread.sleep(60000 / (120 * 4));
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                if(playing ==false){
                                    break;
                                }
                            }
                        }
    
                    }
                }
            }
        }
    
        public void stop(){
    
                playing = false;
        }
    }

    Ainsi qu'une classe "main" pour exécuter mon appli :

    public class MainActivity extends AppCompatActivity {
    
    
        public ToggleButton button1, button2, button3, button4;
        public Sampler mySample;
        public ImageButton playButton;
        public ImageButton stopButton;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            playButton = (ImageButton) findViewById(R.id.play);
            stopButton = (ImageButton) findViewById(R.id.stop);
    
            button1 = (ToggleButton) findViewById(R.id.button1);
            button2 = (ToggleButton) findViewById(R.id.button2);
            button3 = (ToggleButton) findViewById(R.id.button3);
            button4 = (ToggleButton) findViewById(R.id.button4);
    
            playButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v)
                {
                    mySample.play();
                }
            });
    
            stopButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v)
                {
                    mySample.stop();
                }
            });
        }
    }

    Seulement, lorsque je lance mon appli et que j'appuie sur play ou sur stop, l'appli crash et se ferme. Dans le stacktrace j'ai l'erreur suivante : "Attempt to invoke virtual method 'void com.example.minilecteur.Sampler.play()' on a null object reference" et je n'arrive pas a la corriger ni a comprendre d'ou elle vient.

    J'aimerais donc qu'on essaie de m'aider a comprendre mon erreur et pourquoi mon appli ne fonctionne pas correctement.

    Merci d'avance pour vos réponses.

    • Partager sur Facebook
    • Partager sur Twitter
      5 mars 2020 à 16:19:34

      Salut,

      Faudrait peut-être instancié ta variable mySample dans le mainActivity :

      mySample = new Sampler(this) ;

      • Partager sur Facebook
      • Partager sur Twitter

      Le SSD c'est comme une drogue dès que tu commences tu t’arrêtes plus

        5 mars 2020 à 19:03:51

        Merci du conseil, c'est effectivement un des problèmes qu'avait mon application, malheureusement maintenant j'ai a nouveau la même erreur que precedement mais avec "boolean android.widget.ToggleButton.isChecked()". Cela veut-il dire que mes buttons ne sont pas instancier dans le main activity? Comment suis-je censer les instancier?
        • Partager sur Facebook
        • Partager sur Twitter
          6 mars 2020 à 13:27:46

          Normal dans ta classe Sampler  aucun de ToggleButton est instancier.

          Un conseil ne met aucun button à l'intérieur de cette classe .

          Voici comment tu devrais faire : 

          public class MainActivity extends AppCompatActivity {
           
           
              public ToggleButton button1, button2, button3, button4;
              public Sampler mySample;
              public ImageButton playButton;
              public ImageButton stopButton;
           
           
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
           
                  playButton = (ImageButton) findViewById(R.id.play);
                  stopButton = (ImageButton) findViewById(R.id.stop);
           
                  button1 = (ToggleButton) findViewById(R.id.button1);
                  button2 = (ToggleButton) findViewById(R.id.button2);
                  button3 = (ToggleButton) findViewById(R.id.button3);
                  button4 = (ToggleButton) findViewById(R.id.button4);
           
                  playButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                      @Override
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if(isChecked)
                            mySample.play()
                        else
                            mySaample.stop()
                      }
                  });
          }
          public class Sampler {
           
              SoundPool sp;
              private int snareId;
              private Context mycontext;
              public boolean playing;
           
              public Sampler(Context appcontext) {
           
                  this.mycontext = appcontext;
           
                  sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
           
                  snareId = sp.load(mycontext, R.raw.snare, 1);
           
           
              }
           
              public void play() {
           
                      playing = true;
                  while (playing == true) {
                          sp.play(snareId, 10, 10, 1, 0, 1);
                          try {
                              Thread.sleep(60000 / (120 * 4));
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          if (button2.isChecked()) {
                              sp.play(snareId, 10, 10, 1, 0, 1);
                              try {
                                  Thread.sleep(60000 / (120 * 4));
                              } catch (InterruptedException e) {
                                  e.printStackTrace();
                              }
                              if (button3.isChecked()) {
                                  sp.play(snareId, 10, 10, 1, 0, 1);
                                  try {
                                      Thread.sleep(60000 / (120 * 4));
                                  } catch (InterruptedException e) {
                                      e.printStackTrace();
                                  }
                                  if (button4.isChecked()) {
                                      sp.play(snareId, 10, 10, 1, 0, 1);
                                      try {
                                          Thread.sleep(60000 / (120 * 4));
                                      } catch (InterruptedException e) {
                                          e.printStackTrace();
                                      }
                                      if(playing ==false){
                                          break;
                                      }
                                  }
                              }
           
                          
                      }
                  }
              }
           
              public void stop(){
           
                      playing = false;
              }
          }




          • Partager sur Facebook
          • Partager sur Twitter

          Le SSD c'est comme une drogue dès que tu commences tu t’arrêtes plus

            7 mars 2020 à 23:24:04

            Encore merci pour votre réponse et je m'excuse encore de vous déranger avec mes questions de novice mais est-il vraiment possible de mettre un "OncheckedChangeListener" sur un Image Button comme mon play button? De plus si je ne met pas de button sur ma classe sampler, comment ma methode play() vas savoir quand mes bouton toggle sont actif ou non pour savoir si elle doit jouer le son ou non pendant la boucle?
            • Partager sur Facebook
            • Partager sur Twitter
              9 mars 2020 à 13:19:47

              T'inquiète on passe tous un moment ou un autre par là.

              Pour savoir si tes toggles sont qctifs ou non c'eslasse mainActivity qui va le dire à ta classe Sampler.

              Comme tu fais pour play ou stop, tu fais et t'appelles des méthodes à chaque fois qu'un toggle change de valeur.

              • Partager sur Facebook
              • Partager sur Twitter

              Le SSD c'est comme une drogue dès que tu commences tu t’arrêtes plus

                10 mars 2020 à 12:21:23

                Mais si j'ai bien compris, dans ce cas la, mon son ne sera joué que lorsque j'appuierai sur un bouton toggle. Hors mon objectif est d'avoir chaque bouton toogle dans un état fixe (soit "checked", soit "not checked") défini par l'utilisateur et de commencer a jouer les sons au moment de l'appuie sur le bouton play. En résumé, imaginons que l'utilisateur active les 2 premiers bouton toggle et désactive les 2 derniers, au moment ou il appuie sur play, cela devra faire son, son, silence, silence / son, son, silence,silence ... En boucle jusqu’à l'appuie sur le bouton stop. De même, si il active le 1er bouton toggle et les 2 derniers, cela devra faire son, silence, son, son / son, silence, son, son ...

                Le but étant vraiment de crée une mini boite a rythme. J’espère avoir été le plus clair possible, je sais que cela ne doit pas être évident a comprendre car j’explique tes mal et je m'en excuse encore une fois.

                Edit : J'ai finalement réussi a résoudre le problème en instanciant mes boutons toggle dans ma classe sampler en ajoutant :

                button1 = (((Activity)mycontext).findViewById(R.id.button1));

                Merci beaucoup pour votre aide, elle m'a aidé a comprendre mes erreurs !

                Mon appli maintenant ne crash plus lors de l'appuie sur le bouton play mais après avoir jouer un son, l'appli freeze puis quitte car elle ne repond plus... Je ne sais pas du tout d'ou cela provient car je n'ai cette fois ci aucune erreur sur android studio.

                -
                Edité par Michelsilva 10 mars 2020 à 17:17:56

                • Partager sur Facebook
                • Partager sur Twitter

                [Android] Application crash a l'appuie d'un bouton

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown