4

У меня есть служба, которая использует MediaPlayer для потокового интернет-радио:Android MediaPlayer.OnBufferingUpdateListener - Процент забуференном содержания отрицательно

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

Все великие произведения, кроме 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) 

Примечание: -2147483648 является Integer 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); 

      } 
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

Спасибо за ваш ответ. Я попробую это на этой неделе. Однако я не уверен, как это решит проблему с «процентом», имеющим ценности, о которых я упоминал в вопросе. –

+0

Вы проверили URL-адрес музыки? –

+0

Что вы предлагаете искать? URL-адрес работает как воспроизведение звука. –

0

Проблема заключается в драйверах Android Player, точка находится в знаках signed/unsigned. Здесь есть issue.

Чтобы решить эту проблему на уровне виртуальной машины Java вы можете использовать этот код:

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

Интересно! Я попробую это сегодня. Благодаря! –