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时区支持
- 下一篇: 第一次使用echarts绘图(心得)