簡體   English   中英

如何正確發布Android MediaPlayer

[英]How to properly release Android MediaPlayer

我正在嘗試向我的 android 應用程序添加一個按鈕,當點擊該按鈕時它會播放 MP3。 我已經讓它工作了,但沒有辦法釋放 mediaPlayer 對象 - 因此即使在我離開活動后它也會繼續播放。 如果我在 react() 方法(按下按鈕時調用的方法)之外初始化 MediaPlayer 對象,它會導致應用程序在活動打開時強制關閉。 但是如果我在 react() 方法中初始化 MediaPlayer 我就不能在 onQuit() 方法中使用 mplayer.release 。 我在這里沒有看到什么?

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

由於明顯的原因不起作用,並且

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

導致它強制關閉。

更新:這是整個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;
}

}

我認為它的作用是相對不言自明的。 調用時,它會顯示一些文本和一個按鈕,點擊該按鈕開始播放錄音。 當有人點擊后退按鈕時,它應該回到上一個活動並停止錄制。 謝謝你幫助我!

您不能在所有方法之外初始化媒體播放器對象。 如果這樣做,它會嘗試使用尚未創建的上下文。 您需要將其聲明為類變量(在方法之外),並在內部對其進行初始化:

MediaPlayer mediaPlayer;

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

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

此外,我建議閱讀Java 中的變量作用域

這對我很有用。

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

根據 Google docs ,您可以在MediaPlayer實現一個監聽器,如下例所示。

完成后,您可以自動釋放和重置。

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM