如何实现在线媒体播放器的搜索栏

问题描述 投票:0回答:1

您好,第一件事不要将其标记为重复,因为我尝试了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);
            }

        }
    }

感谢您的帮助...!

android android-asynctask android-mediaplayer seekbar android-seekbar
1个回答
0
投票

据我所知,我假设您的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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.