Probleme mit Musik Player

  • 7 Antworten
  • Neuester Beitrag
Diskutiere Probleme mit Musik Player im Android App Entwicklung im Bereich Betriebssysteme & Apps.
S

Simon2202

Neues Mitglied
Hallo!

Ich habe zu Testzwecken um den MediaPlayer zu testen diesen Code geschrieben

PHP:
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);
      boolean status = false;

      Button startbutton = (Button)findViewById(R.id.startbutt);
      startbutton.setOnClickListener(new View.OnClickListener() {
           @Override
            public void onClick(View v) {
                 MediaPlayer abspieler = MediaPlayer.create(MainActivity.this, R.raw.musikflash);
                 if(status == false){
                      abspieler.start();
                      status = true;
                }else{
                     abspieler.stop();
                     status = false;}
              }
       }
  );}
Nur funktioniert meine if-Verzweigung nicht, und bei if(status == false) zeigt er mir diesen Fehler "Variable ´status´ is accessed from within inner class, needs to be declared final.

Und wenn ich ein zweites mal auf den Button drücke wird das Lied noch einmal abgespielt (überlagert das erste)
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Ok...und was isit deine Frage?
Warum kriege ich Exceptions wenn ich den MediaPlayer stoppen will? Beim ersten Klick startet er ncoh aber beim Zweiten geht schon wieder was schief?
 
S

Simon2202

Neues Mitglied
Ouh tut mir leid, ich habe beim bearbeiten die Frage unabsichtlich gelöscht..

Die Frage ist wieso es nicht funktioniert.

Ich habe die if-else Verzweigung eingebaut damit ich durch erneutes tippen auf den Button die Musik stoppen kann. Nur jedes mal wenn ich auf den Button drücke startet die Musik ein zweites mal (sie überlagert sich).

Mir wird bei dem if(status == false) dieser Fehler angezeigt: Variable ´status´ is accessed from within inner class, must be declared final

Hoffe du kannst mir helfen dieses System zum funktionieren zu bringen,
 
Jaiel

Jaiel

Experte
du erzeugst bei jedem Drücken einen neuen Mediaplayer. Beim ersten Drücken startet dieser . Beim 2 Drücken erzeugst du einen anderen Player und stoppst diesen obwohl er nie gestartet hat. Beim dritten drücken erzeugst wieder einen neuen und startest diesen... Das geht dann so weiter


Lösung: MediaPlayer ausserhalb der onClick Methode deklarieren. Gloabal also auch ausserhalb der onCreate , mach es zu einem Memeber deiner Activity...genauso wwie status. Dieser existiert ncith sobald onCreate durchgelaufen ist und du kannnst darauf nciht zugreifen später
 
S

Simon2202

Neues Mitglied
@Jaiel Wenn ich den MediaPlayer und den boolean über die onCreate Methode schreibe (also global?) stürzt die App am Testgerät beim Start ab

Und muss ich den OnClickListener in onCreate haben oder kann ich den irgendwie außerhalb schreiben? (Wenn ich ihn nur raus kopiere funktioniert es nicht
 
Jaiel

Jaiel

Experte
Probier mal:

PHP:
@Override

MediaPlayer abspieler;
boolean status=false;

protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);
      abspieler = MediaPlayer.create(MainActivity.this, R.raw.musikflash);
      Button startbutton = (Button)findViewById(R.id.startbutt);
      startbutton.setOnClickListener(new View.OnClickListener() {
           @Override
            public void onClick(View v) {
                 if(status)
                     abspieler.stop();
                 else
                     abspieler.start();
                 status=!status;
       }
Du solltest einen onPrepareListener benutzen da man den MediaPlayer nciht starten sollte solange dieser nicht im Prepared status ist oder halt solche Fälle catchen und Abstürze zu vermeiden.

P.S.: studier nochmal die sichtbarkeit von Variablen und membern in Java nochmal wenn dir Globale udn Lokale Variablen ncihts sagen: Rheinwerk Computing :: Java ist auch eine Insel – 2.4 Blöcke, Initialisierung und Sichtbarkeit
 
Zuletzt bearbeitet:
S

Simon2202

Neues Mitglied
@Jaiel

Ich habs jetzt so, aber wenn ich das zweite mal draufdrücke bleibt die Musik auch stehen aber lässt sich nichtmehr starten.

PHP:
MediaPlayer abspieler;
boolean status=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);
      abspieler = MediaPlayer.create(MainActivity.this, R.raw.musikflash);
      Button startbutton = (Button) findViewById(R.id.startbutt);
      startbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  if (status) {
                      abspieler.stop();
                      status = !status;
                 }else{
                      abspieler.start();
                      status = !status;
               }
           }
       });
   }
 
Jaiel

Jaiel

Experte
achso ja d msust den 'Meidaplayer wieder in den prepared status versetzen. Dafür würde ich dann ein onPrepared listener benutzen. oder create jedes mal neu:

PHP:
MediaPlayer abspieler;
boolean status=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);
      abspieler = MediaPlayer.create(MainActivity.this, R.raw.musikflash);
      Button startbutton = (Button) findViewById(R.id.startbutt);
      startbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  if (status) {
                      abspieler.stop();
                      abspieler.release();
                      abspieler = MediaPlayer.create(MainActivity.this, R.raw.musikflash);
                 }else{
                      abspieler.start();
               }
               status = !status;
           }
       });
   }