Android SeekBar для контроля прогресса MediaPlayer

У меня есть SeekBar , он корректно отображает прогресс MediaPlayer . Тем не менее, у меня проблемы с поиском – если я ищу окно прокрутки где-то, он просто возвращается на позицию, где проигрывается звуковой файл.

 public class EntityPageActivity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{ private SeekBar seekBar; private Button startMedia; private Button pauseMedia; private MediaPlayer mp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.entity_page); AudioControl(); } public void AudioControl(){ seekBar = (SeekBar) findViewById(R.id.seekBar); startMedia = (Button) findViewById(R.id.play); pauseMedia = (Button) findViewById(R.id.pause); startMedia.setOnClickListener(this); pauseMedia.setOnClickListener(this); } public void run() { int currentPosition= 0; int total = mp.getDuration(); while (mp!=null && currentPosition<total) { try { Thread.sleep(1000); currentPosition= mp.getCurrentPosition(); } catch (InterruptedException e) { return; } catch (Exception e) { return; } seekBar.setProgress(currentPosition); } } public void onClick(View v) { if (v.equals(startMedia)) { if (mp != null && mp.isPlaying()) return; if(seekBar.getProgress() > 0) { mp.start(); return; } mp = MediaPlayer.create(EntityPageActivity.this, R.raw.gl1); mp.start(); seekBar.setProgress(0); seekBar.setMax(mp.getDuration()); new Thread(this).start(); } if (v.equals(pauseMedia) && mp!=null) { mp.pause(); } } public void onStartTrackingTouch(SeekBar seekBar) { } public void onStopTrackingTouch(SeekBar seekBar) { } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser) mp.seekTo(progress); } } 

Таким образом, onProgressChanged недостаточно, чтобы позволить SeekBar контролировать MediaPlayer ?

Что я должен добавить / исправить, чтобы можно было искать?

благодаря

ОБНОВИТЬ

Я узнал, что onProgressChanged никогда не вызывается по какой-то причине. Однако я не могу понять, почему

Solutions Collecting From Web of "Android SeekBar для контроля прогресса MediaPlayer"

Проблема заключается в seekBar.setOnSeekBarChangeListener(this); Поэтому поставьте его в свой метод AudioControl() ….. Вы не установите oncheckchangedlistner в свой поисковый барабан ….

Попробуйте использовать следующий код:

 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser){ mp.seekTo(progress); seekbar.setProgress(progress);} } 

Вы должны включить методы onCreate в onCreate . У меня была та же проблема, и после этого она работала.

 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser){ mediaPlayer.seekTo(progress); seekBar.setProgress(progress); } 

Попробуйте этот код в методе onCreate () и запустите проект. Я надеюсь, что это работает.

 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { mediaPlayer.seekTo(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); 

Я использую этот простой код, чтобы сделать трюк.

 package in.bhartisoftwares.amit.allamitapps; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.SeekBar; import android.widget.Toast; import java.util.Timer; import java.util.TimerTask; public class audioControllerTwo extends AppCompatActivity { MediaPlayer mPlayer; SeekBar audioTraverse; 

Здесь я определил My SeekBar и MediaPlayer в открытом классе. Затем в OnCreate Method у меня есть код:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_audio_controller_two); mPlayer = MediaPlayer.create(this, R.raw.song); 

Здесь я создаю переменную mPlayer, которая находит мой аудиофайл под названием «song», который присутствует в «сырой» папке.

Затем я схватил свой SeekBar под названием «audioTraverse» и назначил его переменной «audioTraverse» и захватил «Длительность» аудиофайла и назначил эту продолжительность моему «audioTraverse» SeekBar следующим образом:

  audioTraverse = (SeekBar) findViewById(R.id.audioTraverse); audioTraverse.setMax(mPlayer.getDuration()); 

Теперь я запускаю таймер, который будет запускаться через каждую секунду, и он соответственно обновит позицию SeekBar. См. Следующий код:

 new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { audioTraverse.setProgress(mPlayer.getCurrentPosition()); } },0, 1000); // here 0 represents first time this timer will run... In this case it will run after 0 seconds after activity is launched // And 1000 represents the time interval afer which this thread ie, "run()" will execute. In this case, it will execute after every 1 second 

Теперь я добавляю «SeekBarChangeListener», это будет искать любые изменения в SeekBar и в методе OnProgressChange (). Я использую метод «.seekTo ()», чтобы перейти к определенной продолжительности в звуковом файле. Код выглядит следующим образом:

  audioTraverse.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { Log.i("Tranverse Change: ", Integer.toString(i)); mPlayer.seekTo(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } }