Android MediaPlayer.OnBufferingUpdateListener - 缓冲内容的百分比为负数

Nik*_*dze 5 java android buffering android-service android-mediaplayer

我有一个MediaPlayer用于流式传输互联网广播的服务:

public class MediaPlayerService extends Service implements 
    MediaPlayer.OnPreparedListener,
    MediaPlayer.OnBufferingUpdateListener {

    private MediaPlayer mMediaPlayer;
    private WifiLock mWifiLock;

    public int onStartCommand(Intent intent, int flags, int startId) {
        mMediaPlayer = new MediaPlayer();

        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnPreparedListener(this);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.setDataSource(MY_URL);

        // Acquire CPU lock and wi-fi lock

        mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
        mWifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
             .createWifiLock(WifiManager.WIFI_MODE_FULL, "Media Player Wi-Fi Lock");
        mWifiLock.acquire();

        mMediaPlayer.prepareAsync();

        return START_STICKY;
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mMediaPlayer.start();
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        Log.d("Buffered " + percent);
    }
}
Run Code Online (Sandbox Code Playgroud)

除了onBufferingUpdate(...)方法,一切都很好.它在日志中打印出来:

Buffered -819200000 
Buffered -819200000 
Buffered -1228800000 
Buffered -1228800000 
Buffered -1228800000 
Buffered -1228800000 
Buffered -1638400000 
Buffered -1638400000 
Buffered -1638400000 
Buffered -1638400000 
Buffered -2048000000 
Buffered -2048000000 
Buffered -2048000000 
Buffered -2048000000 
Buffered -2147483648 (repeated further on) 
Run Code Online (Sandbox Code Playgroud)

注意:-2147483648是整数MIN_VALUE

虽然percent应该是:

到目前为止已缓冲或播放的内容的百分比(0-100)

问题:

  1. 为什么onBufferingUpdate() percent参数中传递的值不正确?
  2. 如何解决?
  3. 有没有其他方法可以获得缓冲的数据量?我的目标是显示一个进度条,让用户知道何时将缓冲足够的数据并开始播放无线电.

谢谢!

小智 0

我不确定为什么会发生这种情况,我遇到了同样的问题,但是这段代码可能会帮助你:

@Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                // TODO Auto-generated method stub

                if (percent < 0 || percent > 100) {
                    //System.out.println("Doing math: (" + (Math.abs(percent)-1)*100.0 + " / " +Integer.MAX_VALUE+ ")" );
                    percent = (int) Math.round((((Math.abs(percent)-1)*100.0/Integer.MAX_VALUE)));

                }
                progressBar.setProgress(percent);
                Log.i("Buffering! " , " " +percent );
                System.out.println("Buffering: " +percent);

            }
Run Code Online (Sandbox Code Playgroud)