在android中播放mp3文件时更新进度条

在android中播放mp3文件时更新进度条,android,android-mediaplayer,Android,Android Mediaplayer,我所拥有的: 我有一个媒体播放器的代码,缓冲的歌曲完美的链接下面 链接:这是一首由谷歌硬盘托管的歌曲 SingleSongBuffering.java public class SingleSongBuffering extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener, OnBufferingUpdateListener{ private ImageButton button

我所拥有的: 我有一个媒体播放器的代码,缓冲的歌曲完美的链接下面

链接
这是一首由谷歌硬盘托管的歌曲

SingleSongBuffering.java

public class SingleSongBuffering extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener, OnBufferingUpdateListener{
    private ImageButton buttonPlayPause;
    private SeekBar seekBarProgress;
    public EditText editTextSongURL;
    private MediaPlayer mediaPlayer;
    private int mediaFileLengthInMilliseconds; // this value contains the song duration in milliseconds. Look at getDuration() method in MediaPlayer class
    private final Handler handler = new Handler();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_song_buffering);
        initView();
    }
    /** This method initialise all the views in project*/
    private void initView() {
        buttonPlayPause = (ImageButton)findViewById(R.id.ButtonTestPlayPause);
        buttonPlayPause.setOnClickListener(this);
        seekBarProgress = (SeekBar)findViewById(R.id.SeekBarTestPlay);
        seekBarProgress.setMax(99); // It means 100% .0-99
        seekBarProgress.setOnTouchListener(this);
        editTextSongURL = (EditText)findViewById(R.id.EditTextSongURL);
        editTextSongURL.setText(R.string.testsong_20_sec);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnBufferingUpdateListener(this);
        mediaPlayer.setOnCompletionListener(this);
    }
    /** Method which updates the SeekBar primary progress by current song playing position*/
    private void primarySeekBarProgressUpdater() {
        seekBarProgress.setProgress((int)(((float)mediaPlayer.getCurrentPosition()/mediaFileLengthInMilliseconds)*100)); // This math construction give a percentage of "was playing"/"song length"
        if (mediaPlayer.isPlaying()) {
            Runnable notification = new Runnable() {
                public void run() {
                    primarySeekBarProgressUpdater();
                }
            };
            handler.postDelayed(notification,1000);
        }
    }
    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.ButtonTestPlayPause){
            /** ImageButton onClick event handler. Method which start/pause mediaplayer playing */
            try {
                mediaPlayer.setDataSource(editTextSongURL.getText().toString()); // setup song from http://www.hrupin.com/wp-content/uploads/mp3/testsong_20_sec.mp3 URL to mediaplayer data source
                mediaPlayer.prepare(); // you must call this method after setup the datasource in setDataSource method. After calling prepare() the instance of MediaPlayer starts load data from URL to internal buffer.
            } catch (Exception e) {
                e.printStackTrace();
            }
            mediaFileLengthInMilliseconds = mediaPlayer.getDuration(); // gets the song length in milliseconds from URL
            if(!mediaPlayer.isPlaying()){
                mediaPlayer.start();
                buttonPlayPause.setImageResource(R.drawable.button_pause);
            }else {
                mediaPlayer.pause();
                buttonPlayPause.setImageResource(R.drawable.button_play);
            }
            primarySeekBarProgressUpdater();
        }
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(v.getId() == R.id.SeekBarTestPlay){
            /** Seekbar onTouch event handler. Method which seeks MediaPlayer to seekBar primary progress position*/
            if(mediaPlayer.isPlaying()){
                SeekBar sb = (SeekBar)v;
                int playPositionInMillisecconds = (mediaFileLengthInMilliseconds / 100) * sb.getProgress();
                mediaPlayer.seekTo(playPositionInMillisecconds);
            }
        }
        return false;
    }
    @Override
    public void onCompletion(MediaPlayer mp) {
        /** MediaPlayer onCompletion event handler. OMethod which calls then song playing is complete*/
        buttonPlayPause.setImageResource(R.drawable.button_play);
    }
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        /** Method which updates the SeekBar secondary progress by current song loading from URL position*/
        seekBarProgress.setSecondaryProgress(percent);
    }
}

什么在起作用: 我能够播放歌曲并播放/暂停歌曲

什么不起作用: 进度条部分不工作! 1.进度条不会从一开始就更新其在进度行末尾的位置

我想要什么: 进度条部分工作,以便我可以拖动进度,以便从该点播放歌曲

如何解决此问题?


进度条部分不工作!1.进度条未更新其 从一开始就在进度线的末尾

**在测试2到3个URL之后

如果分配给MediaPlayer数据源的曲目(url)没有提供曲目信息,则Buffer listner不会给出百分比

您可以像这样进行测试:在为流媒体设置数据源(url)后,一旦mediaplyer开始付费,检查mediaplayer trackDuration(mPlayer.getDuration)是否给出了该曲目的正确持续时间

因为如果轨道持续时间不正确,thn缓冲级别也将不正确

因此,问题可能来自轨迹b,而不是进度条

在下面的代码中,一个url带有曲目详细信息,在播放器准备好并启动后提供曲目持续时间(签入
onPrepared(MediaPlayer mp)

和不提供曲目信息的onr url

检查代码中给出的注释

希望我没弄错你的问题。如果我没有

  private MediaPlayer mPlayer;

    private void playMusic() {
        try {
            mPlayer = new MediaPlayer();
            // For testing purpose added below url
            /**
             * Its not like mp3 or particular coded url will return duration and track info.
             * streaming url should also provide details.
             * 
             * mPlayer.setDataSource("http://50.117.115.210/");
             * 
             * Url which is not providing track details and other information,so
             * here we are not getting track duration and bcz of that buffering
             * update will not be correct.
             * 
             * */
            /**
             * mPlayer.setDataSource("http://www.samisite.com/sound/cropShadesofGrayMonkees.mp3");
             * This is providing correct details of the track which is going to play.
             * 
             */
            mPlayer.setDataSource("http://www.samisite.com/sound/cropShadesofGrayMonkees.mp3");
            mPlayer.prepareAsync();
            mPlayer.setOnPreparedListener(new OnPreparedListener() {

                public void onPrepared(MediaPlayer mp) {
                    mPlayer.start();

                }
            });
            mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

                public void onBufferingUpdate(MediaPlayer mp, int percent) {
                    // Media player will required Track's information to give
                    // you buffering percentage. So once check after starting
                    // player are you getting track duration from
                    // MediaPlayer.getDuration()

                    Log.e("onBufferingUpdate", "" + percent);
                    seekBar.setSecondaryProgress(percent);

                    // *****
                    // Buffering update will be correct if mp.getDuration() > 0
                    // double ratio = percent / 100.0;
                    // int bufferingpercent = (int) (mp.getDuration() * ratio);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private OnSeekBarChangeListener seekbarListner = new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            if (fromUser) {
                if (mPlayer != null) {
                    if (progress <= seekBar.getSecondaryProgress()) {
                    } else {
                        seekBar.setProgress(progress);
                    }

                }
            }
        }
    };
私有媒体播放器mPlayer;
私人音乐{
试一试{
mPlayer=新媒体播放器();
//为了测试目的,在url下面添加了
/**
*它不像mp3或特定编码的url会返回持续时间和曲目信息。
*流式url还应提供详细信息。
* 
*mPlayer.setDataSource(“http://50.117.115.210/");
* 
*Url,它不提供跟踪详细信息和其他信息,所以
*这里我们没有得到缓冲区的跟踪持续时间和bcz
*更新将不正确。
* 
* */
/**
*mPlayer.setDataSource(“http://www.samisite.com/sound/cropShadesofGrayMonkees.mp3");
*这提供了将要播放的曲目的正确细节。
* 
*/
mPlayer.setDataSource(“http://www.samisite.com/sound/cropShadesofGrayMonkees.mp3");
mPlayer.prepareAsync();
mPlayer.setOnPreparedListener(新的OnPreparedListener(){
已准备好公开作废(MediaPlayer mp){
mPlayer.start();
}
});
mPlayer.setOnBufferingUpdateListener(新的OnBufferingUpdateListener(){
public void onBufferingUpdate(MediaPlayer mp,整数百分比){
//媒体播放器需要提供曲目的信息
//您需要检查缓冲百分比。因此,启动后请检查一次
//你是从哪个玩家那里获得曲目持续时间的
//MediaPlayer.getDuration()
Log.e(“onBufferingUpdate”,即“+百分比”);
seekBar.setSecondaryProgress(百分比);
// *****
//如果mp.getDuration()大于0,则缓冲更新将是正确的
//双倍比率=百分比/100.0;
//int bufferingpercent=(int)(mp.getDuration()*比率);
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
private onseekbarchaneglistener seekbarListner=new onseekbarchaneglistener(){
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
如果(来自用户){
if(mPlayer!=null){

如果(你正在使用的进度发布url。。。