【问题标题】:MediaPlayer jumps to last seekTo() positionMediaPlayer 跳转到最后一个 seekTo() 位置
【发布时间】:2015-05-05 08:06:02
【问题描述】:

当我在媒体播放器上调用 seekTo() 方法时,文件从正确的位置播放并且效果很好,但是一旦播放完成,我希望它返回到“0”,而不是返回到的位置我调用了 seekTo() 方法。

我正在使用一个线程,它每 500 毫秒对当前位置进行一次采样,然后根据进度更新我的 SeekBar。由于 mediaPlayer 会回到我“寻找”的最后一个地方 - Seekbar 会跳回到那里,看起来很糟糕。

我希望它在文件播放完毕后返回到 0 位置,当然我可以使用 OnCompletionListener 手动设置它,但这会创建一个跳转到我使用 seekTo() 方法设置的位置,然后返回到 0。

这是我正在进行的进度采样的代码:

private void updateProgress() {
    mListenerThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (isRunning) {
                int position = mMediaPlayer.getCurrentPosition();
                mProgressListener.onProgress(position);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    mMediaPlayer.seekTo(0);
                    e.printStackTrace();
                }
            }
        }
    });
    mListenerThread.start();
}

【问题讨论】:

    标签: android android-mediaplayer android-seekbar


    【解决方案1】:

    您可以保存已设置的位置并检查当前位置是否为设置位置,如果是,请将进度设置为零,这将阻止在 OnCompletionListener 上发生跳转

    定义一个变量

    int lastSeek = -1;
    

    在搜索时将其设置为已搜索到的位置

    void seekTo(int position) {
     //do the seeking here
     lastSeek = position;
    }
    

    然后在 updateProgress 上,您会看到位置是否为 lastSeek,如果是,则位置为 0 aka

    private void updateProgress() {
        mListenerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (isRunning) {
                    int position = mMediaPlayer.getCurrentPosition();
                    mProgressListener.onProgress(position == lastSeek ? 0 : position);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        mMediaPlayer.seekTo(0);
                        e.printStackTrace();
                    }
                }
            }
        });
        mListenerThread.start();
    }
    

    在 onCompletionListener 中将 lastSeek 设置为 -1

    MediaPlayer.OnCompletionListener completionListener
                          = new MediaPlayer.OnCompletionListener(){    
        @Override
        public void onCompletion(MediaPlayer arg0) {
         lastSeek = -1;
         //set actual position to zero and update the bar
       }
    };
    

    【讨论】:

      【解决方案2】:

      请实现 onCompletion 监听器。

      mediaPlayer.setOnCompletionListener(this);
      

      当歌曲结束时,媒体播放器会自动调用 onCompletion 方法。

          public void onCompletion(MediaPlayer arg0) 
          {
              // Write your code
      // Here, set the seekTo to 0 like this seekTo(0);
          }
      

      【讨论】:

      • OP 提到 onCompletion 监听器会使 bar 临时跳转到上次搜索时设置的位置
      • 当然,我正在听这个回调并实际在其中设置,Seekbar 视图手动进度为 0。但是媒体播放器单独跳转到最后一个搜索位置,因此用户实际上看到了一个跳转 - 到最后一个搜索然后 - 到 0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多