基于网络音频的Android播放程序简单示例随着发布MP3文件、播客以及流式音频变得越来越受欢迎,构建可以利用
基于网络音频的Android播放程序简单示例
随着发布MP3文件、播客以及流式音频变得越来越受欢迎,构建可以利用这些服务的音频播放程序的需求也越来越强烈。幸运的是,Android拥有丰富的功能用于处理网络上存在的各种类型的音频。
1.基于HTTP音频播放
这是最简单的的情况,仅仅播放在线的、可通过HTTP对其进行访问的音频文件。比如http://www.mobvcasting.com/android/audio/goodmorningandroid.mp3
但是这里和通常示例化MediaPlayer的方式不同,首先使用的是MediaPlayer的无参构造函数来实例化对象,接着,调用其setDataSource方法,传入想要播放的音频的HTTP位置,随后我们调用prepare方法和start方法。
public class HTTPAudioPlaylistPlayer extends Activity implementsOnClickListener, OnCompletionListener, OnPreparedListener{Vector playlistItems;Button parseBtn, playBtn, stopBtn;EditText editTextUrl;String baseURL = "";MediaPlayer mediaPlayer;int currentPlaylistItemNumber = 0;@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main2);parseBtn = (Button) findViewById(R.id.ParseButton);playBtn = (Button) findViewById(R.id.PlayButton);stopBtn = (Button) findViewById(R.id.StopButton);editTextUrl=(EditText) findViewById(R.id.EditTextURL);playBtn.setOnClickListener(this);parseBtn.setOnClickListener(this);stopBtn.setOnClickListener(this);playBtn.setEnabled(false);stopBtn.setEnabled(false);mediaPlayer = new MediaPlayer();mediaPlayer.setOnCompletionListener(this);mediaPlayer.setOnPreparedListener(this);}@Overridepublic void onPrepared(MediaPlayer mp){// TODO Auto-generated method stubstopBtn.setEnabled(true);Log.v("HTTPAUDIOPLAYLIST", "Playing");mediaPlayer.start();}@Overridepublic void onCompletion(MediaPlayer mp){// TODO Auto-generated method stubLog.v("ONCOMPLETION", "called");mediaPlayer.stop();mediaPlayer.reset();if (playlistItems.size() > currentPlaylistItemNumber + 1){currentPlaylistItemNumber++;String path = ((PlaylistFile) playlistItems.get(currentPlaylistItemNumber)).getFilePath();try{mediaPlayer.setDataSource(path);mediaPlayer.prepareAsync();} catch (IllegalArgumentException e){e.printStackTrace();} catch (IllegalStateException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}}}@Overridepublic void onClick(View v){// TODO Auto-generated method stubif (v == parseBtn){// 下载由editTextUrl对象中的URL指定的M3U文件,并对它进行分析。// 分析的操作是选出任何表示待播放文件的行,创建一个PlaylistItem对象,// 然后把它添加到playlistItems容器里parsePlaylistFile();} else if (v == playBtn){playPlaylistItems();} else if (v == stopBtn){stop();}}private void parsePlaylistFile(){// TODO Auto-generated method stubplaylistItems = new Vector();// 为了从Web获取M3U文件,可以使用Apache软件基金会的HttpClient库,// 它已被android所包括。// 首先创建一个HttpClient对象,其代表类似Web浏览器的事物;HttpClient httpClient = new DefaultHttpClient();// 然后创建一个HttpGet对象,其表示指向一个文件的具体请求。HttpGet getRequest = new HttpGet(editTextUrl.getText().toString());Log.v("URI", getRequest.getURI().toString());// HttpClient将执行HttpGet,并返回一个HttpResponsetry{HttpResponse httpResponse = httpClient.execute(getRequest);if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK){Log.v("HTTP ERROR", httpResponse.getStatusLine().getReasonPhrase());} else{// 在发出请求之后,可以从HttpRequest中获取一个InputStream,// 其包含了所请求文件的内容InputStream inputStream = httpResponse.getEntity().getContent();// 借助一个BufferedReader可以逐行得遍历该文件BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String line;while ((line = bufferedReader.readLine()) != null){Log.v("PLAYLISTLINE", "ORIG:" + line);if (line.startsWith("#")){// 元数据,可以做更多的处理,但现在忽略它} else if (line.length() > 0){// 如果它的长度大于0,那么就假设它是一个播放列表条目String filePath = "";if (line.startsWith("http://")){// 如果行以“http://”开头那么就把它作为流的完整URLfilePath = line;} else{// 否则把它作为一个相对的URL,// 同时把针对该M3U文件的原始请求的URL附加上去filePath = getRequest.getURI().resolve(line).toString();}// 将其添加到播放列表条目的容器中去PlaylistFile playlistFile = new PlaylistFile(filePath);playlistItems.add(playlistFile);}}}} catch (ClientProtocolException e){// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}playBtn.setEnabled(true);}private void playPlaylistItems(){playBtn.setEnabled(false);currentPlaylistItemNumber = 0;if (playlistItems.size() > 0){String path = ((PlaylistFile) playlistItems.get(currentPlaylistItemNumber)).getFilePath();// 在提取出流的或者文件的路径之后,就可以在MediaPlayer上的setDataSource方法使用它了try{mediaPlayer.setDataSource(path);mediaPlayer.prepareAsync();} catch (IllegalArgumentException e){e.printStackTrace();} catch (IllegalStateException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}}}private void stop(){mediaPlayer.pause();playBtn.setEnabled(true);stopBtn.setEnabled(false);}class PlaylistFile{String filePath;public PlaylistFile(String _filePath){filePath = _filePath;}public void setFilePath(String _filePath){filePath = _filePath;}public String getFilePath(){return filePath;}}}