編輯:Android開發實例
Android中提供了對網絡上流媒體的支持,我們可以使用MediaPlayer類來播放一個網絡上的音頻文件。
但是網絡上的站點並不建議我們直接訪問流,我們需要獲取他提供的M3U文件,根據M3U文件來實現流的獲取。
M3U是音頻流地址索引文件,相當於播放列表。
本文通過實例演示,Android中如何訪問網絡上的M3U文件,實現網絡音頻文件的播放。
本文包含三個部分:
1、根據用戶輸入的M3U文件的Url,訪問網絡,獲取該M3U文件
2、對獲取到的M3U文件進行解析,Android中並沒有提供現成的方法來解析M3U文件
3、顯示解析結果,並利用MediaPlayer來播放列表
代碼如下:
1、HttpConnect類:封裝網絡訪問
- package demo.camera;
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.util.Log;
- /**
- * 給類提供訪問網絡的方法
- * @author Administrator
- *
- */
- public final class HttpConnect {
- /**
- * 利用HttpClient獲取指定的Url對應的HttpResponse對象
- * @param url
- * @return
- */
- public static HttpResponse getResponseFromUrl(String url){
- try {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(url);
- Log.v("URI : ", get.getURI().toString());
- HttpResponse response = client.execute(get);
- if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
- return response;
- }
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 利用HttpClient獲取指定Url對應的字符串對象
- * @param url
- * @return
- */
- public static String getStringFromUrl(String url){
- try {
- StringBuilder result = new StringBuilder();
- HttpResponse res = HttpConnect.getResponseFromUrl(url);
- if(res != null){
- InputStream is = res.getEntity().getContent();
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- String line = "";
- while((line = reader.readLine()) != null){
- result.append(line);
- }
- is.close();
- return result.toString();
- }
- } catch (Exception e) {
- // TODO: handle exception
- }
- return null;
- }
- }
2、M3UParser類:解析M3U文件
- package demo.camera;
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.http.HttpResponse;
- /**
- * 該類提供對M3U文件的解析
- * @author Administrator
- *
- */
- public final class M3UParser {
- /**
- * 從指定的Url進行解析,返回一個包含FilePath對象的列表
- * FilePath封裝每一個Audio路徑。
- * @param url
- * @return
- */
- public static List<FilePath> parseFromUrl(String url){
- List<FilePath> resultList = null;
- HttpResponse res = HttpConnect.getResponseFromUrl(url);
- try {
- if(res != null){
- resultList = new ArrayList<M3UParser.FilePath>();
- InputStream in = res.getEntity().getContent();
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String line = "";
- while((line = reader.readLine()) != null){
- if(line.startsWith("#")){
- //這裡是Metadata信息
- }else if(line.length() > 0 && line.startsWith("http://")){
- //這裡是一個指向的音頻流路徑
- FilePath filePath = new FilePath(line);
- resultList.add(filePath);
- }
- }
- in.close();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return resultList;
- }
- /**
- * 返回List<String>類型
- * @param url
- * @return
- */
- public static List<String> parseStringFromUrl(String url){
- List<String> resultList = null;
- HttpResponse res = HttpConnect.getResponseFromUrl(url);
- try {
- if(res != null){
- resultList = new ArrayList<String>();
- InputStream in = res.getEntity().getContent();
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String line = "";
- while((line = reader.readLine()) != null){
- if(line.startsWith("#")){
- //這裡是Metadata信息
- }else if(line.length() > 0 && line.startsWith("http://")){
- //這裡是一個指向的音頻流路徑
- resultList.add(line);
- }
- }
- in.close();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return resultList;
- }
- //解析後的實體對象
- static class FilePath{
- private String filePath;
- public FilePath(String filePath){
- this.filePath = filePath;
- }
- public String getFilePath() {
- return filePath;
- }
- public void setFilePath(String filePath) {
- this.filePath = filePath;
- }
- }
- }
3、InternetAudioDemo類:顯示解析列表嗎,並實現播放
- package demo.camera;
- import java.io.IOException;
- import java.util.List;
- import demo.camera.M3UParser.FilePath;
- import android.app.Activity;
- import android.app.ListActivity;
- import android.app.ProgressDialog;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.View;
- import android.view.inputmethod.InputMethodManager;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListAdapter;
- import android.widget.Toast;
- /**
- * Android支持播放網絡上的Audio
- * 訪問網絡上的Audio,我們通過Http需要獲取音頻流
- * 這可能要涉及到ICY協議。ICY對Http協議進行了擴展
- * 然而,網絡上的站點,往往並不允許我們直接訪問其音頻流
- * 我們需要一種中間文件來指向我們需要的音頻流的地址,以使第三方的軟件可以播放。
- * 對於ICY流來說,其就是一個PLS文件或者一個M3U文件
- * PLS對應的MIME類型為:audio/x-scpls
- * M3U對應的MIME類型為:audio/x-mpegurl
- *
- * 雖然Android提供了對ICy流的支持,但是其並沒有提供現成的方法來解析M3U或PLS文件
- * 所以,為了播放網絡上的音頻流,我們需要自己實現這些文件的解析
- * M3U文件其實就是一個音頻流的索引文件,他指向要播放的音頻流的路徑。
- * @author Administrator
- *
- */
- public class InternetAudioDemo extends ListActivity {
- private Button btnParse, btnPlay, btnStop;
- private EditText editUrl;
- private MediaPlayer player;
- private List<String> pathList;
- private int currPosition = 0; //記錄當前播放的媒體文件的index
- //private ProgressDialog progress;
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.internet_audio);
- btnParse = (Button)this.findViewById(R.id.btn_parse);
- btnPlay = (Button)this.findViewById(R.id.btn_start);
- btnStop = (Button)this.findViewById(R.id.btn_end);
- editUrl = (EditText)this.findViewById(R.id.edit_url);
- editUrl.setText("http://pubint.ic.llnwd.net/stream/pubint_kmfa.m3u");
- // InputMethodManager imm = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE);
- // imm.showSoftInput(editUrl, InputMethodManager.SHOW_IMPLICIT);
- btnPlay.setEnabled(false);
- btnStop.setEnabled(false);
- player = new MediaPlayer();
- player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
- @Override
- public void onCompletion(MediaPlayer player) {
- // 這個方法當MediaPlayer的play()執行完後觸發
- player.stop();
- player.reset();
- if(pathList.size() > currPosition+1){
- currPosition++; //轉到下一首
- prepareToPlay();
- }
- }
- });
- player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
- @Override
- public void onPrepared(MediaPlayer arg0) {
- // 這個方法當MediaPlayer的prepare()執行完後觸發
- btnStop.setEnabled(true);
- player.start();
- //當一曲播放完後,執行onCompletionListener的onCompletion方法
- }
- });
- }
- private void prepareToPlay(){
- try {
- //獲取當前音頻流的路徑後我們需要通過MediaPlayer的setDataSource來設置,然後調用prepareAsync()來完成緩存加載
- String path = pathList.get(currPosition);
- player.setDataSource(path);
- //之所以使用prepareAsync是因為該方法是異步的,因為訪問音頻流是網絡操作,在緩沖和准備播放時需要花費
- //較長的時間,這樣用戶界面就可能出現卡死的現象
- //該方法執行完成後,會執行onPreparedListener的onPrepared()方法。
- player.prepareAsync();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public void onClick(View v){
- int id = v.getId();
- switch(id){
- case R.id.btn_parse:
- //完成解析
- // progress = ProgressDialog.show(this, "提示", "正在解析,請稍後...");
- // progress.show();
- String url = null;
- if(editUrl.getText() != null){
- url = editUrl.getText().toString();
- }
- if(url != null && !url.trim().equals("")){
- pathList = M3UParser.parseStringFromUrl(url);
- ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, pathList);
- this.setListAdapter(adapter);
- btnPlay.setEnabled(true);
- }else{
- Toast.makeText(this, "請輸入正確的M3U文件訪問地址", Toast.LENGTH_LONG).show();
- }
- break;
- case R.id.btn_start:
- //這裡播放是從第一個開始
- btnPlay.setEnabled(false);
- btnParse.setEnabled(false);
- this.currPosition = 0;
- if(pathList != null && pathList.size() > 0){
- prepareToPlay();
- }
- break;
- case R.id.btn_end:
- player.pause();
- btnPlay.setEnabled(true);
- btnStop.setEnabled(false);
- break;
- default:
- break;
- }
- }
- }
4、需要在清單文件中加入INTERNET權限。
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
unity3d發布apk在android虛擬機中運行的詳細步驟(unity3d導出android apk),總的流程分為以下6個步驟: 1、安裝java_jdk
本文實例講述了Android編程使WebView支持HTML5 Video全屏播放的解決方法。分享給大家供大家參考,具體如下: 1)需要在AndroidManif
系統啟動過程圖: Framework層所有的Service都是運行在SystemServer進程中;SystemServer進程是由Zygote進程創