在前面提到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下编译需要把这三个工程都导入,有两个是以库的形式

更多相关文章

  1. Android的BUG(一) - HTML 5 播放streaming video造成卡住的问题
  2. Android(安卓)音乐播放器设计
  3. 2016年最佳的15款Android黑科技工具你知道吗?
  4. Android之监测手机网络状态的广播
  5. Android(安卓)标题有点难写啊
  6. Android入门笔记 - 数据存储 - 网络
  7. android集成 ijkplayer Ijkplayer集成使用方案 + demo
  8. Android(安卓)不得不说的VideoView的一些坑及其解决方案(转)
  9. 【android】音乐播放器之UI设计的点点滴滴

随机推荐

  1. android中多语言的设置
  2. 安卓010 Content Provider
  3. 转载:重新签名,修改系统时间,android.uid.sy
  4. 深入浅出Android(安卓)Service (3)
  5. Android开发学习之电话、短信、联系人
  6. Android(安卓)通信的桥梁 Intent
  7. Android之APK文件签名——keytool和jarsi
  8. Android(安卓)Studio3.0之后gradle.build
  9. Android(安卓)8.0系统上使用WindowManage
  10. 安卓利用百度api定位遇到 经纬度经纬度返