【问题标题】:I have created a song player, I just want that it should play next song on completion [duplicate]我创建了一个歌曲播放器,我只想让它在完成后播放下一首歌曲[重复]
【发布时间】:2021-04-04 02:56:11
【问题描述】:

我尝试了一种方法来播放下一首歌曲,但效果很好,但我认为这不是正确的方式,所以如果您有任何建议,我该如何更正,请告诉我,拜托。

Java 代码

    public class Musicplay extends AppCompatActivity implements View.OnClickListener {

    Button play,next,previous;
    TextView song mar;
    SeekBar seekBar;
    MediaPlayer mediaPlayer;
    int position,idr;
    Handler handler=new Handler();
    

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

        Intent i=getIntent();
        position=i.getIntExtra("position",0);
        play=findViewById(R.id.pause);
        next=findViewById(R.id.next);
        previous=findViewById(R.id.previous);
        songmar=findViewById(R.id.songnamemar);
        songmar.setSelected(true);
        songmar.setText(Musiclist.songname.get(position));
        seekBar=findViewById(R.id.seekBar);

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

        Uri uri=Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
        mediaPlayer=MediaPlayer.create(Musicplay.this,uri);
        seekBar.setMax(mediaPlayer.getDuration());
        mediaPlayer.start();
        play.setBackgroundResource(R.drawable.ic_pause);
        Thread thread=new Thread(){

            @Override
            public void run() {
                super.run();

                int max=mediaPlayer.getDuration();
                int currentposition=0;
                while (currentposition<max)
                {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    currentposition=mediaPlayer.getCurrentPosition();
                    seekBar.setProgress(currentposition);


                }



            }


        };
        thread.start();
        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());
            }
        });

        next.setOnClickListener(Musicplay.this);
        play.setOnClickListener(Musicplay.this);
        previous.setOnClickListener(Musicplay.this);


        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                mediaPlayer.stop();
                mediaPlayer.release();
                if(position<(Musiclist.songname.size()-1)){
                    position=position +1;
                }
                else
                {
                    position=0;
                }
                Intent intent=new Intent(Musicplay.this,Musicplay.class);
                intent.putExtra("position",position);
                startActivity(intent);

            }
        });




    }


    @Override
    public void onClick(View v) {

        idr=v.getId();

        Thread thread2=new Thread(){

            @Override
            public void run() {
                super.run();

                handler.post(new Runnable() {
                    @Override
                    public void run() {

                        switch (idr){
                            case R.id.pause:
                                if(mediaPlayer.isPlaying()){
                                    mediaPlayer.pause();
                                    play.setBackgroundResource(R.drawable.ic_play);

                                }
                                else {
                                    play.setBackgroundResource(R.drawable.ic_pause);
                                    mediaPlayer.start();
                                }
                                break;
                            case R.id.next:
                                mediaPlayer.stop();
                                mediaPlayer.release();
                                if(position<(Musiclist.songname.size()-1)){
                                    position=position +1;
                                    Uri uri=Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
                                    mediaPlayer=MediaPlayer.create(Musicplay.this,uri);
                                    int a=0;
                                    for(int i=0;i<150;i++)
                                    {
                                        a=a+1;
                                    }
                                    mediaPlayer.start();
                                    play.setBackgroundResource(R.drawable.ic_pause);
                                    songmar.setText(Musiclist.songname.get(position));
                                    songmar.setSelected(true);
                                }
                                else {
                                    position=0;
                                    Uri uri=Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
                                    mediaPlayer=MediaPlayer.create(Musicplay.this,uri);
                                    int a=0;
                                    for(int i=0;i<150;i++)
                                    {
                                        a=a+1;
                                    }
                                    mediaPlayer.start();
                                    play.setBackgroundResource(R.drawable.ic_pause);
                                    songmar.setText(Musiclist.songname.get(position));
                                    songmar.setSelected(true);
                                }

                                break;
                            case R.id.previous:
                                mediaPlayer.stop();
                                mediaPlayer.release();
                                if(position>0){
                                    position=position-1;
                                    Uri uri=Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
                                    mediaPlayer=MediaPlayer.create(Musicplay.this,uri);
                                    int a=0;
                                    for(int i=0;i<150;i++)
                                    {
                                        a=a+1;
                                    }
                                    mediaPlayer.start();
                                    play.setBackgroundResource(R.drawable.ic_pause);
                                    songmar.setText(Musiclist.songname.get(position));
                                    songmar.setSelected(true);
                                }
                                else {
                                    position=Musiclist.songname.size()-1;
                                    Uri uri=Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
                                    mediaPlayer=MediaPlayer.create(Musicplay.this,uri);
                                    int a=0;
                                    for(int i=0;i<150;i++)
                                    {
                                        a=a+1;
                                    }
                                    mediaPlayer.start();
                                    play.setBackgroundResource(R.drawable.ic_pause);
                                    songmar.setText(Musiclist.songname.get(position));
                                    songmar.setSelected(true);
                                }
                                break;
                        }


                    }
                });




            }
        };

        thread2.start();






    }
}

请建议最好的方式,而不是开始相同的活动,我该如何播放下一首歌曲。我什至也尝试在 Oncompletelistner 中更改歌曲,但它只工作一次,然后就不会改变。

【问题讨论】:

    标签: android performance optimization


    【解决方案1】:

    与其使用不同的列表位置再次启动活动,只需更改侦听器中MediaPlayer对象的数据源并使用reset()而不是release(),因为它更有效。

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.stop();
                mp.reset();
                if(position<(Musiclist.songname.size()-1)){
                    position=position +1;
                }
                else
                {
                    position=0;
                }
                uri = Uri.parse(String.valueOf(new File(Musiclist.songpath.get(position))));
                mp.setDataSource(this, uri);
                mp.prepare();
            }
        });
    
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
    
        }
    });
    

    【讨论】:

    • 同样的问题是它只改变了歌曲一次然后就停止了。完成后它不会继续更换歌曲
    • 我错了,它在到达准备状态之前调用了 start 方法
    • 如果对您有帮助,请在社区中将答案标记为正确
    • 对不起,但你已经在 Oncompletelistner 中启动了 mediaPlayer,所以它总是抛出错误,因为 mp 没有达到准备状态所以我所做的是,我设置了一个 onpreparedlistner,在这里我调用了 prepare 方法和他们的 I称为启动方法。所以在很多情况下,人们会在这方面出错。所以如果你纠正我会标记正确
    • 当然,更新答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多