【问题标题】:Android MediaPlayer seekBar not working correctlyAndroid MediaPlayer seekBar 无法正常工作
【发布时间】:2018-09-26 00:53:21
【问题描述】:

目前,我正在开发一个媒体播放器,我需要 seekBar 一起工作,目前一切正常!但是,当我触摸 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();
        }
    }
}

这是我用来处理 mediaPlayerseekBar

的代码部分
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 从我单击的位置寻找并继续播放音频,而是将音频简单地返回到开头。我做错了什么?

谢谢。

【问题讨论】:

    标签: java android android-studio android-mediaplayer


    【解决方案1】:

    progress 的最大值为 100。seekTo 函数需要的时间以毫秒为单位。这就是它寻找(几乎)音频开头的原因。

    所以你需要做的不是mediaPlayer.seekTo(progress);,而是:

    long newTime = (progress/100.0) * total_audio_duration_in_millisecond; 
    mediaPlayer.seekTo(newTime);
    

    【讨论】:

    • 不是currentDuration(),总时长:mediaPlayer.getDuration()
    • 我收到:error: incompatible types: possible lossy conversion from double to longlong 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?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多