Android网络收音机--使用Vitamio解码(一)
生活随笔
收集整理的这篇文章主要介绍了
Android网络收音机--使用Vitamio解码(一)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
前面讲到Vitamio可以支持一些流媒体,在这里就用Vitamio来播放网络上的一些流媒体,如:mms、rtsp、http,参考前辈的一些文章来写一个网络收音机程序,对于界面的要求不高,要求实现一些实用的功能
程序目录结构
初期界面,左边是用开源项目SlidingMenu,不清楚的可以参考:Android开源项目SlidingMenu的学习笔记
电台信息是通过XML来保存channel.xml,这里只添加一部分,更详细的可以参考文章最后的链接,自行添加
<?xml version="1.0" encoding="utf-8"?> <Channel><ChannelTypename="推荐电台"ID="1"Icon="fm_icon"Level="1" ><RadioChannelname="国际电台怀旧金曲"ID="001"Icon="default_channel_icon"Level="2"URL="mms://live.cri.cn/oldies/" /><RadioChannelname="国际电台都市流行"ID="002"Icon="default_channel_icon"Level="2"URL="mms://live.cri.cn/pop/" /><RadioChannelname="广东电台音乐之声"ID="003"Icon="default_channel_icon"Level="2"URL="mms://live.rgd.com.cn/993" /><RadioChannelname="广东珠江经济电台"ID="004"Icon="default_channel_icon"Level="2"URL="mms://live.rgd.com.cn/974" /><RadioChannelname="深圳电台飞扬音乐"ID="005"Icon="default_channel_icon"Level="2"URL="mms://vod.szr.com.cn/szr_2" /><RadioChannelname="佛山电台飞跃924"ID="006"Icon="default_channel_icon"Level="2"URL="mms://59.38.110.90/924" /><RadioChannelname="猫扑网络电台"ID="007"Icon="default_channel_icon"Level="2"URL="mms://ting.mop.com/mopradio" /><RadioChannelname="厦门音乐广播"ID="008"Icon="default_channel_icon"Level="2"URL="mms://mediasrv2.iptv.xmg.com.cn/yinyue" /><RadioChannelname="北京电台怀旧金曲"ID="009"Icon="default_channel_icon"Level="2"URL="mms://alive.bjradio.com.cn/cfm1075" /><RadioChannelname="湖南电台音乐之声"ID="010"Icon="default_channel_icon"Level="2"URL="mms://202.103.67.185/音乐" /><RadioChannelname="银河相声小品"ID="011"Icon="default_channel_icon"Level="2"URL="mms://media.radio.cn/radio2" /><RadioChannelname="上海故事广播"ID="012"Icon="default_channel_icon"Level="2"URL="mms://diantai.smgbb.cn/sgwy" /></ChannelType><ChannelTypename="网络电台"ID="2"Icon="fm_icon"Level="1" ><RadioChannelname="猫扑电台"ID="001"Icon="default_channel_icon"Level="2"URL="mms://ting.mop.com/mopradio" /><RadioChannelname="香港AirPOWER"ID="002"Icon="default_channel_icon"Level="2"URL="rtsp://live.onairpower.com:444/" /><RadioChannelname="华语之声综合"ID="003"Icon="default_channel_icon"Level="2"URL="rtsp://60.191.21.139/hy960/rtx" /><RadioChannelname="华语流行畅销"ID="004"Icon="default_channel_icon"Level="2"URL="mms://media.justaiwan.com/22" /><RadioChannelname="中国古典乐"ID="005"Icon="default_channel_icon"Level="2"URL="mms://media.justaiwan.com/24" /><RadioChannelname="舒适环境音乐"ID="006"Icon="default_channel_icon"Level="2"URL="mms://media.justaiwan.com/19" /><RadioChannelname="i RADIO网路音乐台"ID="007"Icon="default_channel_icon"Level="2"URL="http://www.iradio.com.tw/radio.asx" /><RadioChannelname="银河电台中国民乐"ID="008"Icon="default_channel_icon"Level="2"URL="mms://media.radio.cn/radio1" /><RadioChannelname="CVC中文电台"ID="009"Icon="default_channel_icon"Level="2"URL="http://www2.cvc.tv/stream/CVC_Chinese_24kbps.m3u" /><RadioChannelname="QQ综艺之声"ID="010"Icon="default_channel_icon"Level="2"URL="http://qr.fm.qq.com/qqradio?qqradio" /><RadioChannelname="QQ-都市流行"ID="011"Icon="default_channel_icon"Level="2"URL="rtsp://live.cri.cn/pop" /><RadioChannelname="青少年音乐台"ID="012"Icon="default_channel_icon"Level="2"URL="rtsp://58.63.245.9/live/stream=3" /></ChannelType><ChannelTypename="广东电台"ID="3"Icon="fm_icon"Level="1" ><RadioChannelname="广东电台音乐之声"ID="001"Icon="default_channel_icon"Level="2"URL="mms://live.fm993.com.cn/musicfm" /><RadioChannelname="广东珠江经济台"ID="002"Icon="default_channel_icon"Level="2"URL="mms://live.rgd.com.cn/974" /><RadioChannelname="广东南方生活广播"ID="003"Icon="default_channel_icon"Level="2"URL="mms://live.rgd.com.cn/936" /><RadioChannelname="广东羊城交通台"ID="004"Icon="default_channel_icon"Level="2"URL="mms://live.rgd.com.cn/1052" /><RadioChannelname="深圳电台飞扬音乐"ID="005"Icon="default_channel_icon"Level="2"URL="mms://vod.szr.com.cn/szr_2" /><RadioChannelname="佛山电台飞跃924"ID="006"Icon="default_channel_icon"Level="2"URL="mms://59.38.110.90/924" /><RadioChannelname="佛山电台千色985"ID="007"Icon="default_channel_icon"Level="2"URL="mms://59.38.110.90/985" /><RadioChannelname="珠海电台新闻资讯"ID="008"Icon="default_channel_icon"Level="2"URL="mms://www.zhtv.com/fm951" /><RadioChannelname="东莞电台新闻综合"ID="009"Icon="default_channel_icon"Level="2"URL="mms://radio.sun0769.com/fm1008" /><RadioChannelname="江门电台新闻综合"ID="010"Icon="default_channel_icon"Level="2"URL="mms://116.254.197.80/fm1002" /><RadioChannelname="汕头电台音乐之声"ID="011"Icon="default_channel_icon"Level="2"URL="mms://media.strtv.cn/strch3" /><RadioChannelname="潮州电台综合频道"ID="012"Icon="default_channel_icon"Level="2"URL="http://219.131.159.151/czdt939" /></ChannelType><ChannelTypename="中央电台"ID="4"Icon="fm_icon"Level="1" ><RadioChannelname="中央电台中国之声"ID="001"Icon="default_channel_icon"Level="2"URL="mms://mms.cnr.cn//cnr1?MTUjMCM" /><RadioChannelname="中央电台音乐之声"ID="002"Icon="default_channel_icon"Level="2"URL="mms://mms.cnr.cn//cnr3?MTUjMCM" /><RadioChannelname="国际电台乡村民谣"ID="003"Icon="default_channel_icon"Level="2"URL="mms://live.cri.cn/country" /></ChannelType></Channel>读取XML数据放在NetRadioApp.java,使用两个全局的变量来保存,方便其它类的使用 package com.dzt.netradio;import java.io.InputStream; import java.util.ArrayList;import com.dzt.netradio.constant.GlobalConstants; import com.dzt.netradio.domain.RadioChannelData; import com.dzt.netradio.utils.XmlPullParserUtils;import android.app.Application;public class NetRadioApp extends Application {public static ArrayList<RadioChannelData> ChannelTypeList = new ArrayList<RadioChannelData>();public static ArrayList<ArrayList<RadioChannelData>> finalChanneldata = new ArrayList<ArrayList<RadioChannelData>>();@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();InputStream is = null;try {is = getResources().getAssets().open("channel.xml");XmlPullParserUtils.getRadioListData(is, ChannelTypeList,finalChanneldata);} catch (Exception e) {// TODO Auto-generated catch blockGlobalConstants.print_i("NetRadioApp","onCreate Exception = " + e.toString());e.printStackTrace();}}@Overridepublic void onLowMemory() {// TODO Auto-generated method stubsuper.onLowMemory();System.gc();}} 在左侧菜单中使用观察者模式监听点击事件 public void setOnMenuListOnItemClickListener(OnMenuListOnItemClickListener listener) {mListener = listener;}public interface OnMenuListOnItemClickListener {public void onSelectItem(int groupPosition, int childPosition);}@Overridepublic boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {// TODO Auto-generated method stubif (mListener != null) {mListener.onSelectItem(groupPosition, childPosition);}return false;}在MainActivity.java类中设置监听器,和设置Handler与Service通信 /*** 选择对应的Item*/@Overridepublic void onSelectItem(int groupPosition, int childPosition) {// TODO Auto-generated method stubRadioChannelData channelData = NetRadioApp.finalChanneldata.get(groupPosition).get(childPosition);mName.setText(channelData.getChannelName());for (int i = 0; i < mUpdateHandler.size(); i++) {Handler h = mUpdateHandler.get(i);Message msg = h.obtainMessage();msg.what = GlobalConstants.SELECT_ITEM;Bundle data = new Bundle();data.putInt("groupPosition", groupPosition);data.putInt("childPosition", childPosition);msg.setData(data);h.sendMessage(msg);}}public static void addUpdateHandler(Handler handler) {mUpdateHandler.add(handler);}public static void removeUpdateHandler(Handler handler) {mUpdateHandler.remove(handler);}在Service中处理播放PlayService.java package com.dzt.netradio.player;import java.io.IOException;import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener; import io.vov.vitamio.MediaPlayer.OnCompletionListener; import io.vov.vitamio.MediaPlayer.OnPreparedListener; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message;import com.dzt.netradio.MainActivity; import com.dzt.netradio.NetRadioApp; import com.dzt.netradio.WeakHandler; import com.dzt.netradio.constant.GlobalConstants; import com.dzt.netradio.domain.RadioChannelData;public class PlayService extends Service implements OnBufferingUpdateListener,OnCompletionListener, OnPreparedListener {private MediaPlayer mPlayer;public void MyMethod() {GlobalConstants.print_i("PlayService", "MyMethod called");}public PlayService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn myBinder;}public class MyBinder extends Binder {public PlayService getService() {return PlayService.this;}}private MyBinder myBinder = new MyBinder();@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();MainActivity.addUpdateHandler(selectItemHandler);GlobalConstants.print_i("PlayService", "onCreate called");}@Overridepublic void onDestroy() {// TODO Auto-generated method stubMainActivity.removeUpdateHandler(selectItemHandler);if (mPlayer != null) {mPlayer.release();mPlayer = null;}super.onDestroy();}@Overridepublic void onPrepared(MediaPlayer mp) {// TODO Auto-generated method stubGlobalConstants.print_i("PlayService", "onPrepared called");if (mPlayer != null)mPlayer.start();// 开始播放}@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stubGlobalConstants.print_i("PlayService", "onCompletion called");}@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {// TODO Auto-generated method stub// GlobalConstants.print_i("PlayService", "onBufferingUpdate called");}private void playSelectItem(String url) {if (mPlayer == null) {try {mPlayer = new MediaPlayer(this);// 播放流媒体的对象mPlayer.setDataSource(url);// 设置流媒体的数据源mPlayer.prepare();mPlayer.setOnBufferingUpdateListener(this);mPlayer.setOnCompletionListener(this);mPlayer.setOnPreparedListener(this);} catch (Exception e) {GlobalConstants.print_i("PlayService", "onCreate Exception = "+ e.toString());e.printStackTrace();}} else {try {mPlayer.setDataSource(url);// 设置流媒体的数据源} catch (Exception e) {GlobalConstants.print_i("PlayService", "onCreate Exception = "+ e.toString());e.printStackTrace();}}GlobalConstants.print_i("PlayService", "playSelectItem url = " + url);}private Handler selectItemHandler = new SelectItemHandler(this);private static class SelectItemHandler extends WeakHandler<PlayService> {public SelectItemHandler(PlayService owner) {super(owner);// TODO Auto-generated constructor stub}@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubPlayService owner = getOwner();if (owner == null)return;switch (msg.what) {case GlobalConstants.SELECT_ITEM:Bundle data = msg.getData();int groupPosition = data.getInt("groupPosition");int childPosition = data.getInt("childPosition");RadioChannelData channelData = NetRadioApp.finalChanneldata.get(groupPosition).get(childPosition);owner.playSelectItem(channelData.getChannelURL());break;default:break;}}}} 但只能播放一次,再点击Item就不能播放或自动退出,还没找到是什么原因,在后续再解决这个问题Vitamio中的MediaPlayer与系统中的MediaPlayer非常相似,用起来也方便,比VLC要方便相关代码:http://download.csdn.net/detail/deng0zhaotai/7905367
参考文档:
1、网络电台地址(一)
2、网络电台地址(二)
3、http://www.cnblogs.com/mythou/p/3231184.html
总结
以上是生活随笔为你收集整理的Android网络收音机--使用Vitamio解码(一)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: mysql的时区_MySQL时区支持
- 下一篇: vmware虚拟机安装 安卓Androi