Я создал собственный виджет, который воспроизводит аудио с URL.Я использую MediaPlayer API.
Способ реализации виджета:
public class CustomAudioPayer extends RelativeLayout {
....
public CustomAudioPayer(final Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = LayoutInflater.from(context);
View mainView = inflater.inflate(R.layout.custom_palyer, this, true);
// Code to initialize player & set url
.......
// On button click, we start playing
play_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
showProgressBar(true);
mediaPlayer = new MediaPlayer();
if (headers != null) {
Uri uri = Uri.parse(url);
mediaPlayer.setDataSource(getContext(), uri, headers);
.....
mediaPlayer.prepare();
.....
}
}
}
...........
}
Но когда медиаплеер буферизует поток с сервера, я вижу одну индикаторную строку,Индикатор выполнения видимый и невидимый в зависимости от состояния игрока и прослушивателя буфера.
mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int what) {
Log.e(TAG, "onBufferingUpdate");
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
showProgressBar(true);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
showProgressBar(false);
break;
}
}
});
Но первоначальный индикатор выполнения не отображается как можно скорее в виджете.т.е. когда проигрыватель мультимедиа запрашивает контент с сервера в это время, ни один из методов setVisibility не работает с индикатором выполнения.
Метод showProgressBar (логический):
private void showProgressBar(boolean show) {
if (show) {
buffering_pb.setVisibility(VISIBLE);
Log.e(TAG, "buffering_pb: Visible");
} else {
buffering_pb.setVisibility(INVISIBLE);
Log.e(TAG, "buffering_pb: Invisible");
}
}
Добавлены журналыв приведенном выше методе печатается на logcat как можно скорее, они становятся видимыми или невидимыми, но пользовательский интерфейс не показывает соответствующее изменение видимости, что может пойти не так?
Обновление:
Пользователь pskink в комментариях предлагается документация MediaPlayer.prepareAsync () вместо MediaPlayer.prepare();
, я изменил метод с prepare()
на prepareAsyc()
, тогда мои взгляды отражают видимое и невидимоенемедленно заявить.