Android media player and seekbar sync issue

爱⌒轻易说出口 提交于 2019-11-29 00:41:35
Sunil Pandey

in MediaPlayer you can set onPreparedListener in which you can synchronize your seek as as follow

mMediaPlayer.setOnPreparedListener(new OnPreparedListener() 
          {
            @Override
            public void onPrepared(final MediaPlayer mp) 
            {
                seekBar.setMax(mp.getDuration());
                   new Thread(new Runnable() {

                           @Override
                           public void run() {
                                   while(mp!=null && mp.getCurrentPosition()<mp.getDuration())
                                   {
                                       seekBar.setProgress(mp.getCurrentPosition());
                                       Message msg=new Message();
                                       int millis = mp.getCurrentPosition();

                                       msg.obj=millis/1000;
                                       mHandler.sendMessage(msg);
                                        try {
                                            Thread.sleep(100);
                                        } 
                                        catch (InterruptedException e) {
                                           e.printStackTrace();
                                        }
                                   }
                           }
                   }).start();

            }
        });
AnandJaisy

Try this code this code works fine in my system.

    package san.san;

    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.SeekBar;

    public class Mp3player extends Activity {

        private Button buttonPlayStop;
        private MediaPlayer mediaPlayer;
        private SeekBar seekBar;

        private final Handler handler = new Handler();

        // Here i override onCreate method.
        //
        // setContentView() method set the layout that you will see then
        // the application will starts
        //
        // initViews() method i create to init views components.
        @Override
        public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                setContentView(R.layout.main);
                initViews();  

        }

        // This method set the setOnClickListener and method for it (buttonClick())
        private void initViews() {
            buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
            buttonPlayStop.setOnClickListener(new OnClickListener() {public void onClick(View v) {buttonClick();}});

            mediaPlayer = MediaPlayer.create(this, R.raw.sound41772); 

            seekBar = (SeekBar) findViewById(R.id.SeekBar01);
            seekBar.setMax(mediaPlayer.getDuration());
            seekBar.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {
                seekChange(v);
                return false; }
            });

        }

        public void startPlayProgressUpdater() {
            seekBar.setProgress(mediaPlayer.getCurrentPosition());

            if (mediaPlayer.isPlaying()) {
                Runnable notification = new Runnable() {
                    public void run() {
                        startPlayProgressUpdater();
                    }
                };
                handler.postDelayed(notification,1000);
            }else{
                mediaPlayer.pause();
                buttonPlayStop.setText(getString(R.string.play_str));
                seekBar.setProgress(0);
            }
        } 

        // This is event handler thumb moving event
        private void seekChange(View v){
            if(mediaPlayer.isPlaying()){
                SeekBar sb = (SeekBar)v;
                mediaPlayer.seekTo(sb.getProgress());
            }
        }

        // This is event handler for buttonClick event
        private void buttonClick(){
            if (buttonPlayStop.getText() == getString(R.string.play_str)) {
                buttonPlayStop.setText(getString(R.string.pause_str));
                try{
                    mediaPlayer.start();
                    startPlayProgressUpdater();
                }catch (IllegalStateException e) {
                    mediaPlayer.pause();
                }
            }else {
                buttonPlayStop.setText(getString(R.string.play_str));
                mediaPlayer.pause();
            }
        }
    }

This is my main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/widget31"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:text="@string/play_str"
        android:textSize="15pt"
        android:textStyle="bold"
        android:id="@+id/ButtonPlayStop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <SeekBar
        android:id="@+id/SeekBar01"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/ButtonPlayStop"/>
</RelativeLayout>

This is my string.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android mp3 player</string>
    <string name="play_str">PLAY</string>
    <string name="pause_str">PAUSE</string>
</resources>

This is my manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="san.san"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Mp3player"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

You need to change a little bit code inside your onProgressChanged() Method.

Try this code :

public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
    // TODO Auto-generated method stub
           if(arg2){
                gs.mp.seekTo(arg1);
            }
}

You can also look into my below code .This code works well in my computer and emulator .

My Java code :

public class MainActivity extends AppCompatActivity {

MediaPlayer player;
//Handler seekHandler = new Handler();
AudioManager audioManager;
SeekBar musicseek;

public void play(View view)
{
    player.start();
}
public void pause(View view)
{
    player.pause();
}

public void stop(View view)
{
    player.stop();
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    player=MediaPlayer.create(this,R.raw.music);
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int maxvol= audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    int curvol= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

    SeekBar bar=(SeekBar) findViewById(R.id.seekBar);
      bar.setMax(maxvol);
      bar.setProgress(curvol);
      musicseek= (SeekBar) findViewById(R.id.musicSeek);

    musicseek.setMax(player.getDuration());
    musicseek.setProgress(player.getCurrentPosition());

    final Handler han = new Handler();

    Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

            musicseek.setProgress(player.getCurrentPosition());
            han.postDelayed(this, 1000);
        }
    };

    myRunnable.run();

    musicseek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

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

            if(fromUser){
                player.seekTo(progress);
            }
        }
    });

    bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            //String temp=Integer.toString(progress);
            //Log.i("seekbar ",temp);

            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
        }
    });

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

My Xml Code can be found in this link : https://pastebin.com/a2Sdr0bB

I hope this helps !!! .

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!