Android网络收音机--使用Vitamio解码(二)
16lz
2021-01-26
在前面提到Android网络收音机--使用Vitamio解码(一)实现了播放流媒体文件,但只能播放一次,在这里可以随机点击左边的menu来播放,但Vitamio还是不是很稳定,有的uri已经过期无法播放了,我下载了一个PC版的网络收音机来对比,如果PC上能播放,在这里也是能播放的,使用了网上的一些图片,先看下修改后的界面
由于当前没有网络,所以只显示了Name
程序目录结构
关键代码选择一个流媒体播放的流程
private void playSelectItem(String url) {if (mPlayer == null)vplayerInit(false);mPlayer.reset();Uri uri = Uri.parse(url);try {mPlayer.setDataSource(PlayService.this, uri); // 设置流媒体的数据源mPlayer.prepareAsync(); // 需要缓冲的不能使用prepare是阻塞的,prepareAsync是异步} catch (Exception e) {// TODO: handle exception}GlobalConstants.print_i("PlayService", "playSelectItem url = " + url);}private void vplayerInit(boolean isHWCodec) {try {mPlayer = new MediaPlayer(this.getApplicationContext(), isHWCodec);// 播放流媒体的对象mPlayer.setOnBufferingUpdateListener(this); // 在网络视频流缓冲变化时调用mPlayer.setOnCompletionListener(this); // 视频播放完成后调用mPlayer.setOnPreparedListener(this); // 在视频预处理完成后调用mPlayer.setOnErrorListener(this); // 在异步操作调用过程中发生错误时调用。例如视频打开失败mPlayer.setOnInfoListener(this); // 在有警告或错误信息时调用。例如:开始缓冲、缓冲结束、下载速度变化} catch (Exception e) {// TODO: handle exception}}在这里也处理了来电的广播
/** * 处理来电广播 * * @author Administrator * */class PhoneStateReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubfinal String action = intent.getAction();if (action.equalsIgnoreCase(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {final String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);GlobalConstants.print_i("PhoneStateReceiver","onReceive state = " + state);if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)|| state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {// 接听会收到EXTRA_STATE_OFFHOOKpause();} else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {// 挂断会收到EXTRA_STATE_IDLEstartPlay();}}}}监听网络状态改变,如果没有网络,会显示一个Wifi的图标
class ConnectionChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubfinal String action = intent.getAction();if (action.equalsIgnoreCase(CONNECTIVITY_CHANGE_ACTION)) {State wifiState = null;State mobileState = null;ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();if (wifiState != null && mobileState != null&& State.CONNECTED != wifiState&& State.CONNECTED == mobileState) {// 手机网络连接成功ToastUtils.show(getApplicationContext(), "已连接到网络");mIvIcon.setVisibility(View.VISIBLE);mIvWifi.setVisibility(View.GONE);} else if (wifiState != null && mobileState != null&& State.CONNECTED != wifiState&& State.CONNECTED != mobileState) {// 手机没有任何的网络ToastUtils.show(getApplicationContext(), "当前网络不可用");mIvIcon.setVisibility(View.GONE);mIvWifi.setVisibility(View.VISIBLE);} else if (wifiState != null && State.CONNECTED == wifiState) {// 无线网络连接成功ToastUtils.show(getApplicationContext(), "已连接到网络");mIvIcon.setVisibility(View.VISIBLE);mIvWifi.setVisibility(View.GONE);}} }}其它相关的代码,感兴趣的可以下载源码
代码下载:http://download.csdn.net/detail/deng0zhaotai/7964051
如果要在Eclipse下编译需要把这三个工程都导入,有两个是以库的形式
更多相关文章
- Android的BUG(一) - HTML 5 播放streaming video造成卡住的问题
- Android(安卓)音乐播放器设计
- 2016年最佳的15款Android黑科技工具你知道吗?
- Android之监测手机网络状态的广播
- Android(安卓)标题有点难写啊
- Android入门笔记 - 数据存储 - 网络
- android集成 ijkplayer Ijkplayer集成使用方案 + demo
- Android(安卓)不得不说的VideoView的一些坑及其解决方案(转)
- 【android】音乐播放器之UI设计的点点滴滴