【问题标题】:MediaPlayer onCompletion not called and issue with seekbarMediaPlayer onCompletion 未调用并与 seekbar 问题
【发布时间】:2021-08-13 07:26:30
【问题描述】:

我正在通过教程制作音乐播放器,试图让它更先进,我用谷歌搜索了我的问题,但找不到答案。我对 onCompletion 方法有问题,由于某种原因它只被调用一次,我打开第一首歌曲,第二首歌曲开始(调用 onCompletion),然后下一首歌曲不开始(不再调用 onCompletion)。我的seekbar也有问题,几首歌曲后,它并没有改变它的位置,而且非常随机。

public class PlayerActivity extends AppCompatActivity {
    ImageButton playBtn, nextBtn, prevBtn, fastforwardBtn, fastrewindBtn, repeatBtn, shuffleBtn;
    TextView songName, timeStart, timeStop;
    SeekBar seekBar;
    BarVisualizer visualizer;
    ImageView albumArt;
    private boolean repeatBtnPressed, shuffleBtnPressed;
    String sName;
    public static final String EXTRA_NAME = "song_name";
    static MediaPlayer mediaPlayer;
    int position;
    ArrayList<File> mySongs;
    Thread updateSeekBar;

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onDestroy() {
        if (visualizer != null) {
            visualizer.release();
        }
        super.onDestroy();
    }

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

        //customising action bar

//        getSupportActionBar().setTitle("Now Playing");
//        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//        getSupportActionBar().setDisplayShowHomeEnabled(true);

        playBtn = findViewById(R.id.playbtn);
        nextBtn = findViewById(R.id.nextbtn);
        prevBtn = findViewById(R.id.prevbtn);
        fastforwardBtn = findViewById(R.id.fastforwardbtn);
        fastrewindBtn = findViewById(R.id.fastrewindbtn);
        repeatBtn = findViewById(R.id.repeatbtn);
        shuffleBtn = findViewById(R.id.shufflebtn);
        songName = findViewById(R.id.songname);
        timeStart = findViewById(R.id.timestart);
        timeStop = findViewById(R.id.timeend);
        seekBar = findViewById(R.id.seekbar);
        visualizer = findViewById(R.id.blastvisualizer);
        albumArt = findViewById(R.id.albumart);

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

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

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

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

        Runnable target;
        updateSeekBar = new Thread() {
            @Override
            public void run() {
                int totalDuration = mediaPlayer.getDuration();
                int currentPosition = 0;

                while (currentPosition < totalDuration) {
                    try {
                        sleep(500);
                        currentPosition = mediaPlayer.getCurrentPosition();
                        seekBar.setProgress(currentPosition);
                        seekBar.setMax(mediaPlayer.getDuration()); // added to fix seekbar bug
                    } catch (InterruptedException | IllegalStateException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        seekBar.setMax(mediaPlayer.getDuration());
        updateSeekBar.start();
        //seekbar color
        seekBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);
        seekBar.getThumb().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);

        seekBar.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 = createTime(mediaPlayer.getDuration());
        timeStop.setText(endTime);

        final Handler handler = new Handler();
        final int delay = 0; // 1000 on default

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                String currentTime = createTime(mediaPlayer.getCurrentPosition());
                timeStart.setText(currentTime);
                handler.postDelayed(this, delay);
            }
        }, delay);

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

                }
            }
        });
        // next listener

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                System.out.println("OnCompletionListener called");
                nextBtn.performClick();
            }
        });

        int audioSessionId = mediaPlayer.getAudioSessionId();
        if (audioSessionId != -1) {
            visualizer.setAudioSessionId(audioSessionId);
        }

        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
                mediaPlayer.release();
                position = ((position + 1) % mySongs.size());
                Uri u = Uri.parse(mySongs.get(position).toString());
                mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
                sName = mySongs.get(position).getName();
                PlayerActivity.this.songName.setText(sName);
                mediaPlayer.start();
                playBtn.setBackgroundResource(R.drawable.ic_pause);
                startAnimation(albumArt);
                String endTime = createTime(mediaPlayer.getDuration());
                timeStop.setText(endTime);

                int audioSessionId = mediaPlayer.getAudioSessionId();
                if (audioSessionId != -1) {
                    visualizer.setAudioSessionId(audioSessionId);
                }
            }
        });
        prevBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
                mediaPlayer.release();
                position = ((position - 1) < 0) ? (mySongs.size() - 1) : (position - 1);

                Uri u = Uri.parse(mySongs.get(position).toString());
                mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
                sName = mySongs.get(position).getName();
                PlayerActivity.this.songName.setText(sName);
                mediaPlayer.start();
                playBtn.setBackgroundResource(R.drawable.ic_pause);
                startAnimation(albumArt);

                String endTime = createTime(mediaPlayer.getDuration());
                timeStop.setText(endTime);

                int audioSessionId = mediaPlayer.getAudioSessionId();
                if (audioSessionId != -1) {
                    visualizer.setAudioSessionId(audioSessionId);
                }
            }
        });
        fastforwardBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + 10000);
                }
            }
        });
        fastrewindBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() - 10000);
                }
            }
        });
        repeatBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!repeatBtnPressed) {
                    repeatBtnPressed = true;
                    repeatBtn.setBackgroundResource(R.drawable.ic_repeat_on);
                } else {
                    repeatBtnPressed = false;
                    repeatBtn.setBackgroundResource(R.drawable.ic_repeat_off);
                }
            }
        });

        shuffleBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!shuffleBtnPressed) {
                    shuffleBtnPressed = true;
                    //repeatBtnPressed = false;
                    shuffleBtn.setBackgroundResource(R.drawable.ic_shuffle_on);
                } else {
                    shuffleBtnPressed = false;
                    shuffleBtn.setBackgroundResource(R.drawable.ic_shuffle_off);

                }
            }
        });
    }

    public void startAnimation(View view) {
        Object target;
        ObjectAnimator animator = ObjectAnimator.ofFloat(albumArt, "rotation", 0f, 360f);
        animator.setDuration(1000);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(animator);
        animatorSet.start();
    }

    public String createTime(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 randomSong() {
        mediaPlayer.stop();
        mediaPlayer.release();
        Random r = new Random();
        int randomPos = r.nextInt(mySongs.size());
        position = ((position + randomPos) % mySongs.size());
        Uri u = Uri.parse(mySongs.get(position).toString());
        mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
        sName = mySongs.get(position).getName();
        songName.setText(sName);
        mediaPlayer.start();
        playBtn.setBackgroundResource(R.drawable.ic_pause);
        startAnimation(albumArt);

        String endTime = createTime(mediaPlayer.getDuration());
        timeStop.setText(endTime);

        shuffleBtnPressed = true;

        int audioSessionId = mediaPlayer.getAudioSessionId();
        if (audioSessionId != -1) {
            visualizer.setAudioSessionId(audioSessionId);
        }
    }
}

【问题讨论】:

  • 检查 this 的搜索栏
  • 顺便说一下,您提供的链接一般是关于 MediaPlayer,而不是关于 seekbar。
  • 是的,检查他在教程中提供的搜索条码。
  • 我已经查过了,呵呵,如果你不知道如何帮助,请不要尝试。
  • 以这种态度@Redas Shuliakas 祝你的编程生涯一切顺利

标签: java android mobile android-mediaplayer


【解决方案1】:

mediaPlayer.start();之后

设置mediaPlayer.setOnCompletionListener(this)

【讨论】:

  • 必需类型:OnCompletionListener
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多