我制作了一个自定义小部件,可以播放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(boolean)方法:
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上,它们变为可见或不可见,但UI不会显示相应的可见性更改,这可能是什么问题?
更新:
用户pskink在MediaPlayer.prepareAsync()而不是MediaPlayer.prepare();
的注释建议文档中,我将方法从prepare()
更改为prepareAsyc()
,然后我的视图反映了可见的并立即进入隐形状态。