Ответ 1
Задача seekBar.setOnSeekBarChangeListener(this);
Так что поставьте ее в свой AudioControl()
метод.....
Вы не устанавливаете oncheckchangedlistner
в свой поиск...
У меня есть 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
?
Что я должен добавить/исправить, чтобы разрешить поиск?
Спасибо
UPDATE
Я выяснил, что onProgressChanged
никогда не вызывается по какой-то причине. Однако я не могу понять, почему
Задача seekBar.setOnSeekBarChangeListener(this);
Так что поставьте ее в свой AudioControl()
метод.....
Вы не устанавливаете oncheckchangedlistner
в свой поиск...
Попробуйте использовать следующий код:
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser){
mp.seekTo(progress);
seekbar.setProgress(progress);}
}
Вы должны включить методы поиска в onCreate
. У меня была та же проблема, и после этого она работала.
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
mediaPlayer.seekTo(progress);
seekBar.setProgress(progress);
}
Попробуйте этот код в методе onCreate() и запустите project.I надеюсь, что это работает.
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 у меня есть такой код:
@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 i.e., "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) {
}
});
}
}
если вы хотите возобновить воспроизведение медиа-плеера в определенном положении из хода изменения скорости поиска, я рекомендую вам сделать это в методе onStopTrackingTouch(). этот метод уведомит, что пользователь закончил жест касания, а затем установите позицию медиаплеера из текущего положения.
@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());
}