Сейчас я разрабатываю медиаплеер и мне нужно seekBar для совместной работы, на данный момент все в порядке! но, когда я касаюсь определенной позиции панели поиска, медиаплеер должен следовать и установил песню в эту определенную позицию, но песня и seekBar Вернуться к началу, и я не знаю, почему это происходит.
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler();
public TextView song_detail;
public TextView time1;
public TextView time2;
private String player_status = "playing";
private ImageButton player_img;
public static SeekBar seekBar;
private static MediaPlayer mediaPlayer;
@SuppressLint("RestrictedApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
song_detail = findViewById(R.id.song_detail);
song_detail.setVisibility(View.GONE);
time1 = findViewById(R.id.time_1);
time2 = findViewById(R.id.time_2);
seekBar = findViewById(R.id.seekBar);
final Runnable mRunnable = new Runnable() {
@Override
public void run() {
if (mediaPlayer != null){
int CurrentPosition = mediaPlayer.getCurrentPosition();
String m_1;
String s_1;
seekBar.setProgress(CurrentPosition/1000);
final int minutes_1 = (CurrentPosition/1000)/60;
final int seconds_1 = ((CurrentPosition/1000)%60);
if (minutes_1 < 10) {
m_1 = "0" + minutes_1;
} else {
m_1 = "" + minutes_1;
}
if (seconds_1 < 10) {
s_1 = "0" + seconds_1;
} else {
s_1 = "" + seconds_1;
}
time1.setText(m_1 + ":" + s_1);
int Duration = mediaPlayer.getDuration();
String m_2;
String s_2;
final int minutes_2 = (Duration/1000)/60;
final int seconds_2 = ((Duration/1000)%60);
if (minutes_2 < 10) {
m_2 = "0" + minutes_2;
} else {
m_2 = "" + minutes_2;
}
if (seconds_2 < 10) {
s_2 = "0" + seconds_2;
} else {
s_2 = "" + seconds_2;
}
time2.setText(m_2 + ":" + s_2);
}
mHandler.postDelayed(this, 1000);
}
};
mRunnable.run();
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mediaPlayer != null && fromUser){
Toast.makeText(getApplicationContext(), String.valueOf(progress), Toast.LENGTH_LONG).show();
mediaPlayer.seekTo(progress);
seekBar.setProgress(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) { }
});
}
public void initAudio(final Context context, final String url) {
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(context, Uri.parse(url));
}
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//Toast.makeText(context, "TEST", Toast.LENGTH_LONG).show();
killMediaPlayer();
}
});
seekBar.setMax(mediaPlayer.getDuration()/1000);
mediaPlayer.start();
}
public void killMediaPlayer() {
if (mediaPlayer != null) {
try {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void pauseAudio() {
if (!(mediaPlayer == null)) {
mediaPlayer.pause();
}
}
public static void startAudio() {
if (!(mediaPlayer == null)) {
mediaPlayer.start();
}
}
}
Это часть кода, которую я использую для работы с медиа плеер и seekBar
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mediaPlayer != null && fromUser){
Toast.makeText(getApplicationContext(), String.valueOf(progress), Toast.LENGTH_LONG).show();
mediaPlayer.seekTo(progress);
seekBar.setProgress(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) { }
});
}
Но, как я уже сказал, вместо того, чтобы mediaPlayer искать и продолжать звук с позиции, на которую я щелкнул, звук просто возвращается к началу. Что я делаю не так?
Спасибо.




Максимальное значение для progress - 100. Функция seekTo занимает время в миллисекундах. Вот почему он стремится к началу (почти) звука.
Итак, вместо mediaPlayer.seekTo(progress); нужно сделать:
long newTime = (progress/100.0) * total_audio_duration_in_millisecond;
mediaPlayer.seekTo(newTime);
Я получаю: error: incompatible types: possible lossy conversion from double to long на long newTime = (progress/100.0) * mediaPlayer.getDuration();
long newTime = (long) ((progress/100.0) * mediaPlayer.getDuration());error: incompatible types: possible lossy conversion from long to intвы объявили newTime как int?
Извините за путаницу. Просто введите long в int: mediaPlayer.seekTo((int)newTime);
Он работает неправильно, я нажимаю на определенную позицию seekBar, и позиция другая.
по какой причине у вас есть seekBar.setProgress(progress); в onProgressChanged?
удалить эту строку
Готово, сэр, но когда я нажимаю на определенную позицию, звук переходит в другое
что значит "аудио переходит к другому"? Это идет на другой звук?
Другая позиция, например, если я щелкну в 00:50, она перейдет в 02:38.
Откуда вы знаете, что щелкаете в 00:50?
Это был просто пример. Я пытаюсь объяснить, что это неправильно
seekBar.setProgress(CurrentPosition/1000); этот код неверный
это должен быть int progress=(int)((currentPosition/(float)totalDuration)*100); seekBar.setProgress(progress);
Эта часть тоже правильная? seekBar.setMax(mediaPlayer.getDuration()/1000);
да удалите это .. пусть max для seekBar будет 100 (по умолчанию)
Мой прогресс seekBar не обновляется, он завис при запуске
Привет, сэр, я решил проблему с помощью этого: progress*1000
not currentDuration (), общая продолжительность:
mediaPlayer.getDuration()