Android MediaPlayer.OnBufferingUpdateListener - Percentage of buffered content is negative

I have a service that uses MediaPlayerfor streaming internet radio:

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);
    }
}

Everything works fine except for the method onBufferingUpdate(...). He prints this in a magazine:

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) 

Note: -2147483648 - Integer MIN_VALUE

While it percentshould be:

Percentage (0-100) of content that has been buffered or played so far

Questions :

  • Why are invalid values ​​passed in the parameter onBufferingUpdate() percent?
  • How to fix it?
  • Is there any other way to get how much data has been buffered? My goal is to show a progress bar to give the user an idea of ​​when enough data will be buffered and the radio will start playing.

Thank!

+4
3

, , , :

@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);

            }
0
public void onBufferingUpdate(MediaPlayer mp, int percent) 
{
    double ratio = percent / 100.0;
    bufferingLevel = (int)(mp.getDuration() * ratio);

    seekBar.setSecondaryProgress(bufferingLevel);
}

- OnCreateView OnCreate

seekBar.setMax(GET_TOTAL_DURATION_OF_SONG);
0

Android Player, signed/unsigned. issue.

JVM, :

percent &= 0xFF;
// media broadcasts may return values more than 100
if (percent > 100)
    percent = 0;
0

Source: https://habr.com/ru/post/1528026/


All Articles