您好,第一件事不要将其标记为重复,因为我尝试了StackOverFlow
上提供的许多解决方案,例如-
SeekBar and media player in android
Android MediaPlayer : How do i show a progress dialog while buffering audio
Show MediaPlayer Buffering in Seek bar as Secondary Progress
Android - SeekBar and MediaPlayer等等.....
我正在尝试创建在线媒体播放器,但无法对其实施Seekbar
。以下是我在AsyncTask
的帮助下从URL播放音频文件的代码。
onCreate代码
Play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new PlayFileFromURL().execute(Song_URL);
}
});
AsyncTask
class PlayFileFromURL extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
if (dialog.isShowing()) {
dialog.dismiss();
}
dialog.setMessage("Loading It may take time according to your network speed");
dialog.setTitle("Loading, please wait.");
dialog.show();
Song_Name.setText(getString(R.string.app_name));
}
@Override
protected String doInBackground(String... f_url) {
try {
mediaPlayer.setDataSource(f_url[0]);
mediaPlayer.prepare();
} catch (Exception ignored) {
}
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
asyncTask.cancel(true);
Toast.makeText(MainActivity.this, "AsyncTask is stopped", Toast.LENGTH_LONG).show();
}
@Override
protected void onPostExecute(String file_url) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (!mediaPlayer.isPlaying()) {
Play.setBackgroundResource(R.drawable.play);
mediaPlayer.start();
Toast.makeText(MainActivity.this, "Playing sound", Toast.LENGTH_SHORT).show();
} else {
mediaPlayer.pause();
Toast.makeText(MainActivity.this, "Pausing sound", Toast.LENGTH_SHORT).show();
Play.setBackgroundResource(R.drawable.stop);
}
}
}
感谢您的帮助...!
据我所知,我假设您的AsyncTask是在Activity类中定义的。这是我在服务中使用的一种方法,但仍可以在您的设置中使用。
在您的Activity类中:
@Override
public void onCreate(){
// ...
mySeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser){
if(fromUser){
// Handle updating the media's playback to the set position
// if you allow seekbar dragging to scrub through the track
int draggedPos = (int) (progress / 100 * mediaPlayer.getDuration());
mediaPlayer.seekTo(draggedPos);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekbar){
isDragging = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekbar){
isDragging = false;
}
});
}
// Create a member variable to track when the seekbar is being dragged
boolean isDragging = false;
// Create a handler as a member variable
Handler playbackHandler = new Handler();
// Create a runnable as a member variable
Runnable playbackRunnable = new Runnable(){
@Override
public void run(){
playbackHandler.removeCallbacks(playbackRunnable);
int progress = (int) (mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration() * 100)
// Update your Seekbar's progress while the seekbar isn't being dragged
if(!isDragging){
mySeekBar.setProgress(progress);
}
long delay = 1000; // Delay for one second
// If the MediaPlayer is playing, trigger the runnable again with the delay
if(mediaPlayer.isPlaying(){
playbackHandler.postDelayed(playbackRunnable, delay);
}
}
}
然后,在AsyncTask中,当您切换播放时:
@Override
protected void onPostExecute(String result){
// ...
if(!mediaPlayer.isPlaying()){
// ...
mediaPlayer.start();
playbackHandler.postDelayed(playbackRunnable, 0); // Start the runnable with no delay
}else{
// ...
mediaPlayer.pause();
playbackHandler.removeCallbacks(playbackRunnable); // Stop executing the runnable
}
}