Pytanie Jak prawidłowo wypuścić Android MediaPlayer


Próbuję dodać przycisk do mojej aplikacji na Androida, gdzie odtwarza MP3 po dotknięciu przycisku. Zrobiłem to działa, ale bez możliwości zwolnienia obiektu mediaPlayer - dlatego gra nadal, nawet po zakończeniu aktywności. Jeśli zainicjuję obiekt MediaPlayer spoza mojej metody react () (co zostanie wywołane po naciśnięciu przycisku), spowoduje to zamknięcie aplikacji po jej otwarciu. Ale jeśli zainicjuję MediaPlayer w ramach metody react (), wówczas nie będę mógł użyć mplayer.release w metodzie onQuit (). Czego tu nie widzę?

    public void react(View view) {
    MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
    mediaPlayer.start();
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

Nie działa z oczywistych powodów i

MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
public void react(View view) {
            mediaPlayer.start(); 
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

Powoduje, że jest blisko.

Aktualizacja: Oto cała klasa Java.

public class ToBeOrNot extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_to_be_or_not);

        }
MediaPlayer mediaPlayer;

public void react(View view) {
        mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
        mediaPlayer.start(); 
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    //getMenuInflater().inflate(R.menu.activity_to_be_or_not, menu);
    // Locate MenuItem with ShareActionProvider
   return true;
}

}

Myślę, że to, co robi, jest względnie samoobjaśniające. Po wywołaniu pokazuje tekst i przycisk, który po dotknięciu rozpoczyna odtwarzanie nagrania. Kiedy ktoś kliknie przycisk Wstecz, powinien powrócić do poprzedniej aktywności i zatrzymać nagrywanie. Dziękuję za pomoc!


10
2018-02-23 21:11


pochodzenie


Jeśli odpowiedziałeś na inne pytanie i chcesz zadać nowe pytanie, powinieneś otworzyć nowe pytanie, a nie tylko je edytować. - Geobits
W porządku, po prostu nie chcę zadawać zbyt wielu pytań. - dacelbot
Oto nowe pytanie. stackoverflow.com/questions/15046888/... Jeśli masz ochotę odpowiedzieć, że byłoby wspaniale, dziękuję. Albo może ktoś inny, albo sam wymyślę odpowiedź. - dacelbot


Odpowiedzi:


Nie można zainicjować obiektu mediaplayer poza wszystkimi metodami. Jeśli to zrobisz, spróbuje użyć kontekstu, który nie został jeszcze utworzony. Musisz zadeklarować go jako zmienną klasy (poza metodą) i zainicjować wewnątrz:

MediaPlayer mediaPlayer;

public void react(View view) {
    mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
    mediaPlayer.start(); 
}

protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

Ponadto, polecam lekturę zakres zmienny w Javie.


14
2018-02-23 22:00



Ach, dziękuję bardzo! To był naprawdę głupi błąd. Zdałem sobie sprawę, że miałem problem z zasięgiem, ale mój mózg nie działał i nie mogłem wymyślić, jak to naprawić. - dacelbot
Więc skopiowałem twój przykład i teraz działa dobrze, ale kiedy wciskam przycisk powrotu po naciśnięciu przycisku, który uruchamia dźwięk, siła aplikacji zamyka się. jakieś pomysły? - dacelbot
Jest z tym wiele potencjalnych problemów. Proponuję odpowiedzieć na kolejne pytanie wyjaśniające, co robisz we wszystkich metodach cyklu życia (tworzenie, wznawianie, wstrzymywanie, zatrzymywanie itp.). Wyjaśnij co dokładnie ty chcieć to zrobić. - Geobits


To działało dla mnie dobrze.

public class MainActivity extends AppCompatActivity {

    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mediaPlayer = MediaPlayer.create(this, R.raw.beep_warning);

        final CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);
        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkBox.isChecked()) {
                    mediaPlayer.start();
                    mediaPlayer.setLooping(true);
                }
                else{
                    mediaPlayer.pause();
                }
                }


        });

    }
    @Override
    protected void onStop() {
        super.onStop();
        mediaPlayer.release();
    }

0
2018-04-25 10:59