java - 如何在 Android 中更改 Activity 时停止 MediaPlayer

标签 java android android-activity android-mediaplayer

我正在尝试在 Android 中实现一系列音乐播放器。当我按下后退按钮时,我希望应用程序返回到上一个屏幕时停止音乐。我尝试了很多解决方案并在线搜索,但如果我输入“停止”和“释放”等行,应用程序就会崩溃。也许我做得不正确?感谢您即将提供的任何帮助...这是我的代码...

public class MusicPlayerA extends Activity {

    private MediaPlayer mediaPlayer;
    public TextView songName, duration;
    private double timeElapsed = 0, finalTime = 0;
    private int forwardTime = 2500, backwardTime = 2500;
    private Handler durationHandler = new Handler();
    private SeekBar seekbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //set the layout of the Activity
        setContentView(R.layout.musicplayerview);
        //initialize views
        initializeViews();
    }

    public void initializeViews(){
        songName = (TextView) findViewById(R.id.songName);
        mediaPlayer = MediaPlayer.create(this, R.raw.druidsad);
        finalTime = mediaPlayer.getDuration();
        duration = (TextView) findViewById(R.id.songDuration);
        seekbar = (SeekBar) findViewById(R.id.seekBar);
        songName.setText("Druids Ad");  
        seekbar.setMax((int) finalTime);
        seekbar.setClickable(true);
    }

    // play mp3 song
    public void play(View view) {
        mediaPlayer.start();
        timeElapsed = mediaPlayer.getCurrentPosition();
        seekbar.setProgress((int) timeElapsed);
        durationHandler.postDelayed(updateSeekBarTime, 100);
    }

    //handler to change seekBarTime
    private Runnable updateSeekBarTime = new Runnable() {
        public void run() {
            //get current position
            timeElapsed = mediaPlayer.getCurrentPosition();
            //set seekbar progress
            seekbar.setProgress((int) timeElapsed);
            //set time remaining
            double timeRemaining = finalTime - timeElapsed;
            duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining))));

            //repeat yourself that again in 100 miliseconds
            durationHandler.postDelayed(this, 100);
        }
    };

    // pause mp3 song
    public void pause(View view) {
        mediaPlayer.pause();
    }

    // go forward at forwardTime seconds
    public void forward(View view) {
        //check if we can go forward at forwardTime seconds before song endes
        if ((timeElapsed + forwardTime) <= finalTime) {
            timeElapsed = timeElapsed + forwardTime;

            //seek to the exact second of the track
            mediaPlayer.seekTo((int) timeElapsed);
        }
    }

    // go backwards at backwardTime seconds
    public void rewind(View view) {
        //check if we can go back at backwardTime seconds after song starts
        if ((timeElapsed - backwardTime) > 0) {
            timeElapsed = timeElapsed - backwardTime;

            //seek to the exact second of the track
            mediaPlayer.seekTo((int) timeElapsed);
        }
    }


    public void stopMusic(View view) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }



     // handler for back button used on all screens
     public void BackButton2 (View view) {

        //mediaPlayer.pause();
        //mediaPlayer.release();
         //mediaPlayer.stop();
        // mediaPlayer.release();
        stopMusic(view);

        MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.soundbackbutton) ;
        mMediaPlayer.start();

        Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vib.vibrate(200);

        Intent mus = new Intent (this, Music.class);
        startActivity(mus);
     }

    // handler for back button used on all screens
     public void BackButton (View view) {

        // mediaPlayer.pause();
         //mediaPlayer.release();

        // mediaPlayer.stop();
        // mediaPlayer.release();

        MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.soundbackbutton) ;
        mMediaPlayer.start();

        Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vib.vibrate(200);

        Intent mn = new Intent (this, Music.class);
        startActivity(mn);
     }
}

最佳答案

当您点击后退按钮时,Android 系统应该调用 Activity.onPause()。我没有看到 onPause() 的任何实现,除非您的后退按钮处理程序正在调用它。我会尝试这样的事情:

@Override
protected void onPause() {
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.pause();
        if (isFinishing()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}

关于java - 如何在 Android 中更改 Activity 时停止 MediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32260243/

相关文章:

JavaFX:未装饰的窗口

java - 为什么此代码可以编译,但会出现运行时 ClassNotFoundException?

android - 序列化 Android Intent

android - 自定义适配器 ListView,setOnCheckedChangeListener 不工作

java - 使用抽象类和 Android Activity

android - 为什么当我从 onResume Activity 调用 AsyncTask 时,我看不到进度对话框?

java - 套餐产品数量不存在

java - 计算字符串中的行数和单词数

android - gradle + ndkbuild + android studio 2.2 如何设置支持的 ABI?

android - 如何在切换 Activity/选项卡时关闭 Android 键盘