簡體   English   中英

Android 媒體播放器在第二首歌后停止

[英]Android Media Player stops after second song

我正在制作一個音樂播放器應用程序,但我遇到了問題。 播放完一首歌曲后,下一首歌曲開始播放,但當第二首歌曲播放完畢時,它會凍結並且什么也不做。 它曾經在日志上說媒體播放器因未處理的事件而消失,但我找到了另一種使用 Player.this.runOnUiThread 處理它的方法,現在它沒有這么說,但仍然不起作用。 有代碼:

    String sname;
    public static final String EXTRA_NAME = "song_name";
    static MediaPlayer mediaPlayer;
    int position;
    ArrayList<File> mySongs;

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

        if(mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }

        Intent i = getIntent();
        Bundle bundle = i.getExtras();

        mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
        String songName = i.getStringExtra("songName");
        position = bundle.getInt("pos", 0);
        txtsname.setSelected(true);
        Uri uri = Uri.parse(mySongs.get(position).toString());
        sname = mySongs.get(position).getName();
        txtsname.setText(sname);

        setAlbumCover();

        mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        mediaPlayer.start();

        Player.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
               if(mediaPlayer != null){
                int currentPosition = mediaPlayer.getCurrentPosition();
                seekMusic.setProgress(currentPosition);
               }
            }
        });

        seekMusic.setMax(mediaPlayer.getDuration());

        seekMusic.getProgressDrawable().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
        seekMusic.getThumb().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN);

        seekMusic.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mediaPlayer.seekTo(seekBar.getProgress());
            }
        });

        String endTime = evalTime(mediaPlayer.getDuration());
        txtsstop.setText(endTime);

        final Handler handler = new Handler();
        final int delay = 500;

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                String currTime = evalTime(mediaPlayer.getCurrentPosition());
                seekMusic.setProgress(mediaPlayer.getCurrentPosition());
                txtsstart.setText(currTime);
                handler.postDelayed(this, delay);
            }
        }, delay);

        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mediaPlayer.isPlaying()){
                    playButton.setImageResource(R.drawable.ic_play);
                    mediaPlayer.pause();
                }
                else{
                    playButton.setImageResource(R.drawable.ic_pause);
                    mediaPlayer.start();
                }
            }
        });

        nextButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if(!shuffle){
                    position = ((position + 1) % mySongs.size());

                    playSong(position);
                }
                else {
                    Random rand = new Random();

                    position = rand.nextInt(mySongs.size());

                    playSong(position);
                }
            }
        });

        previousButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                position = ((position - 1 >= 0) ? position - 1 : mySongs.size() - 1);
                playSong(position);
            }
        });

        shuffleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!shuffle) {
                    shuffle = true;
                    loop = false;

                    loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
                    shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.activeButton), PorterDuff.Mode.SRC_ATOP);
                }
                else {
                    shuffle = false;
                    loop = false;

                    shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
                }
            }
        });

        loopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!loop) {
                    loop = true;
                    shuffle = false;

                    shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
                    loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.activeButton), PorterDuff.Mode.SRC_ATOP);
                }
                else {
                    loop = false;
                    shuffle = false;

                    loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
                }
            }
        });

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (loop) {
                    playSong(position);
                    loop = true;
                }
                else nextButton.performClick();
            }
        });
    }
    public String evalTime (int duration){
        String time = "";
        int min = duration / 1000 / 60;
        int sec = duration / 1000 % 60;

        time += min + ":";
        if(sec < 10){
            time += "0";
        }
        time += sec;

        return time;
    }

    public void playSong(int pos){
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
        mediaPlayer = null;

        Uri u = Uri.parse(mySongs.get(pos).toString());

        mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
        sname = mySongs.get(pos).getName();
        txtsname.setText(sname);

        seekMusic.setMax(mediaPlayer.getDuration());
        String endTime = evalTime(mediaPlayer.getDuration());
        txtsstop.setText(endTime);

        mediaPlayer.start();

        playButton.setImageResource(R.drawable.ic_pause);
        setAlbumCover();
    }
}

我一直在嘗試,但我嘗試的一切都不起作用。 任何想法如何解決它?

創建MediaPlayer的新實例后(在您使用MediaPlayer.create( ) 的情況下,您必須等待它准備就緒,然后您才能調用start()

使用mediaPlayer.setOnPreparedListener並在它觸發時開始播放

但首先要熟悉MediaPlayer doc 和 state 圖 可能更容易使用一些庫,例如ExoPlayer

除此之外,您應該有兩種方法:啟動和銷毀玩家。 目前您正在以一種方式(更簡單)在onCreate中啟動播放器,而另一段類似的代碼在playSong方法中。 最好從Bundle中讀取pos並直接在onCreate中調用playSong

暫無
暫無

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

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