17

我正在尝试向我的 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;
}

}

我认为它的作用是相对不言自明的。当被调用时,它会显示一些文本和一个按钮,当点击该按钮时会开始播放录音。当有人点击后退按钮时,它应该回到上一个活动并停止录制。谢谢你帮助我!

4

3 回答 3

26

您不能在所有方法之外初始化 mediaplayer 对象。如果这样做,它会尝试使用尚未创建的上下文。您需要将其声明为类变量(在方法之外),并在内部对其进行初始化:

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 中的变量范围

于 2013-02-23T22:00:46.097 回答
1

根据 Google docsMediaPlayer ,您可以在下面的示例中实现侦听器。

完成后,您可以自动释放和重置。

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();
于 2020-10-19T16:37:23.490 回答
1

这对我很有效。

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();
    }
于 2017-04-25T10:59:38.707 回答