【问题标题】:Android MediaPlayer - Unwanted new instance created whenever activity is instantiatedAndroid MediaPlayer - 每当实例化活动时都会创建不需要的新实例
【发布时间】:2012-05-27 21:19:12
【问题描述】:

我在 Activity 中有一个 MediaPlayer,每当用户点击特定歌曲时都会调用它。播放 MediaPlayer 后,如果用户单击返回,他们可以选择另一首歌曲。

问题在于,在选择第二首歌曲后,MediaPlayer 会再次创建,并且会同时开始播放两首歌曲。我尝试在活动开始时使用“if MediaPlayer.isplaying, MediaPlayer.stop”,但是一旦用户按下并滚动播放另一首歌曲,MediaPlayer 就会停止。

代码如下所示。如果您能保持基本的回答,我将不胜感激,因为我对 java 的了解有限(我正在尝试开发!)。

包含 MediaPlayer 的 Activity:

package music.tabber;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

public class MusicPlayer extends Activity {

    private ImageButton playButton;
    private TextView songTitleLabel;
    private TextView songArtistLabel;
    private MediaPlayer mediaPlayer = new MediaPlayer();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playing);

        Bundle extras = getIntent().getExtras();
        String songPath = extras.getString("songPath");
        String songTitle = extras.getString("songTitle");
        String songArtist = extras.getString("songArtist");

        playButton = (ImageButton) findViewById(R.id.playButton);
        songTitleLabel = (TextView) findViewById(R.id.songTitleLabel);
        songArtistLabel = (TextView) findViewById(R.id.songArtistLabel);

        playSong(songPath); 

        songArtistLabel.setText(songArtist);
        songTitleLabel.setText(songTitle);


        playButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                if(mediaPlayer.isPlaying()){
                    if(mediaPlayer!=null){
                        mediaPlayer.pause();
                        playButton.setImageResource(R.drawable.ic_play);
                    }

                }else{
                    if(mediaPlayer!=null){
                        mediaPlayer.start();
                        playButton.setImageResource(R.drawable.ic_pause);
                    }
                }
           }

        });

    }

    private void playSong(String songPath) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(songPath);
            mediaPlayer.prepare();
            mediaPlayer.start();

            // Changing Button Image to pause image
            playButton.setImageResource(R.drawable.ic_pause);

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

感谢您的帮助。

【问题讨论】:

    标签: android media-player android-activity recreate


    【解决方案1】:

    也许您想考虑Services 对 MediaPlayer 进行灵活控制。从任何 Activity 播放/暂停都很简单。

    【讨论】:

    • 感谢您的回答 Primož,我将不得不阅读有关服务的内容。这么容易实现吗?
    • 您将不得不做一些阅读,但实际上之后实现它很简单。 Here 就是一个例子;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多