Android 使用Vitamio打造自己的萬(wàn)能播放器(9)—— 在線播放 (在線電視)
前言
如果不想自己去找視頻看,以傳統(tǒng)方式看電視也不錯(cuò),比如CCTV、湖南衛(wèi)視等。本章從網(wǎng)絡(luò)收集幾百個(gè)電視臺(tái)的地址,采用多級(jí)分類(lèi)方式呈現(xiàn),極大豐富在線播放部分的內(nèi)容。
系列
1、Android 使用Vitamio打造自己的萬(wàn)能播放器(1)——準(zhǔn)備
2、Android 使用Vitamio打造自己的萬(wàn)能播放器(2)—— 手勢(shì)控制亮度、音量、縮放
3、Android 使用Vitamio打造自己的萬(wàn)能播放器(3)——本地播放(主界面、視頻列表)
4、Android 使用Vitamio打造自己的萬(wàn)能播放器(4)——本地播放(快捷搜索、數(shù)據(jù)存儲(chǔ))
5、Android 使用Vitamio打造自己的萬(wàn)能播放器(5)——在線播放(播放優(yōu)酷視頻)
6、Android 使用Vitamio打造自己的萬(wàn)能播放器(6)——在線播放(播放列表)
7、Android 使用Vitamio打造自己的萬(wàn)能播放器(7)——在線播放(下載視頻)
8、Android 使用Vitamio打造自己的萬(wàn)能播放器(8)——細(xì)節(jié)優(yōu)化
正文
一、目標(biāo)
以多級(jí)目錄分類(lèi)方式在在線視頻欄目下添加電視臺(tái)。
二、主要代碼
電視臺(tái)的地址目前是存在XML文件里,那么本文代碼主要就是解析XML的數(shù)據(jù)了。
package com.nmbb.oplayer.ui.helper; import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import android.content.Context; import com.nmbb.oplayer.po.OnlineVideo; /** 從XML讀取電視臺(tái)節(jié)目 */ public class XmlReaderHelper { /** 獲取所有電視分類(lèi) */ public static ArrayList<OnlineVideo> getAllCategory(final Context context) { ArrayList<OnlineVideo> result = new ArrayList<OnlineVideo>(); DocumentBuilderFactory docBuilderFactory = null; DocumentBuilder docBuilder = null; Document doc = null; try { docBuilderFactory = DocumentBuilderFactory.newInstance(); docBuilder = docBuilderFactory.newDocumentBuilder(); // xml file 放到 assets目錄中的 doc = docBuilder.parse(context.getResources().getAssets() .open("online.xml")); // root element Element root = doc.getDocumentElement(); NodeList nodeList = root.getElementsByTagName("category"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i);// category OnlineVideo ov = new OnlineVideo(); NamedNodeMap attr = node.getAttributes(); ov.title = attr.getNamedItem("name").getNodeValue(); ov.id = attr.getNamedItem("id").getNodeValue(); ov.category = 1; ov.level = 2; ov.is_category = true; result.add(ov); // Read Node } } catch (IOException e) { } catch (SAXException e) { } catch (ParserConfigurationException e) { } finally { doc = null; docBuilder = null; docBuilderFactory = null; } return result; } /** 讀取分類(lèi)下所有電視地址 */ public static ArrayList<OnlineVideo> getVideos(final Context context, String categoryId) { ArrayList<OnlineVideo> result = new ArrayList<OnlineVideo>(); DocumentBuilderFactory docBuilderFactory = null; DocumentBuilder docBuilder = null; Document doc = null; try { docBuilderFactory = DocumentBuilderFactory.newInstance(); docBuilder = docBuilderFactory.newDocumentBuilder(); // xml file 放到 assets目錄中的 doc = docBuilder.parse(context.getResources().getAssets() .open("online.xml")); // root element Element root = doc.getElementById(categoryId); if (root != null) { NodeList nodeList = root.getChildNodes(); for (int i = 0, j = nodeList.getLength(); i < j; i++) { Node baseNode = nodeList.item(i); if (!"item".equals(baseNode.getNodeName())) continue; String id = baseNode.getFirstChild().getNodeValue(); if (id == null) continue; OnlineVideo ov = new OnlineVideo(); ov.id = id; Element el = doc.getElementById(ov.id); if (el != null) { ov.title = el.getAttribute("title"); ov.icon_url = el.getAttribute("image"); ov.level = 3; ov.category = 1; NodeList nodes = el.getChildNodes(); for (int m = 0, n = nodes.getLength(); m < n; m++) { Node node = nodes.item(m); if (!"ref".equals(node.getNodeName())) continue; String href = node.getAttributes() .getNamedItem("href").getNodeValue(); if (ov.url == null) { ov.url = href; } else { if (ov.backup_url == null) ov.backup_url = new ArrayList<String>(); ov.backup_url.add(href); } } if (ov.url != null) result.add(ov); } } } } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } finally { doc = null; docBuilder = null; docBuilderFactory = null; } return result; } }
三、下載
請(qǐng)移步#Taocode(SVN):
項(xiàng)目地址:http://code.taobao.org/p/oplayer
SVN地址:http://code.taobao.org/svn/oplayer/
四、參考
Android讀寫(xiě)XML(上)——package說(shuō)明
各大電視臺(tái)直播地址
網(wǎng)絡(luò)電視直播地址收集
結(jié)束
本文是新入手Macbook Pro上寫(xiě)的第一篇文章,諸多不習(xí)慣,仍然在一天內(nèi)成功丟棄鼠標(biāo),離IOS又近一步了:) 系列文章并不強(qiáng)調(diào)用某種技術(shù),但盡可能涉及到多種技術(shù),只有充分了解各種技術(shù)才能在適當(dāng)?shù)臅r(shí)候使用合適的技術(shù)。先實(shí)現(xiàn)后優(yōu)化,不必一步到位糾結(jié)于每個(gè)細(xì)節(jié)。
以上就是對(duì)Android Vitamio 開(kāi)發(fā)播放在線電視相關(guān)資料,后續(xù)繼續(xù)補(bǔ)充。
- Android 使用Vitamio打造自己的萬(wàn)能播放器(10)—— 本地播放 (縮略圖、視頻信息、視頻掃描服務(wù))
- Android 使用Vitamio打造自己的萬(wàn)能播放器(8)——細(xì)節(jié)優(yōu)化
- Android 使用Vitamio打造自己的萬(wàn)能播放器(7)——在線播放(下載視頻)
- Android 使用Vitamio打造自己的萬(wàn)能播放器(6)——在線播放(播放列表)
- Android 使用Vitamio打造自己的萬(wàn)能播放器(5)——在線播放(播放優(yōu)酷視頻)
- Android 使用Vitamio打造自己的萬(wàn)能播放器(4)——本地播放(快捷搜索、數(shù)據(jù)存儲(chǔ))
- Android 使用Vitamio打造自己的萬(wàn)能播放器(3)——本地播放(主界面、播放列表)
- Android 使用Vitamio打造自己的萬(wàn)能播放器(2)—— 手勢(shì)控制亮度、音量、縮放
- Android 使用Vitamio打造自己的萬(wàn)能播放器(1)——準(zhǔn)備
- Android使用vitamio插件實(shí)現(xiàn)視頻播放器
相關(guān)文章
Android抽象布局——include、merge 、ViewStub詳解
這篇文章主要介紹了 Android抽象布局——include、merge 、ViewStub詳解,詳細(xì)的介紹了三種布局各有的優(yōu)勢(shì),有興趣的同學(xué)可以參考一下。2016-12-12android自定義環(huán)形統(tǒng)計(jì)圖動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了android自定義環(huán)形統(tǒng)計(jì)圖動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07RxJava實(shí)戰(zhàn)之訂閱流基本原理示例解析
這篇文章主要為大家介紹了RxJava實(shí)戰(zhàn)之訂閱流基本原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12[Alibaba-ARouter]淺談簡(jiǎn)單好用的Android頁(yè)面路由框架
這篇文章主要介紹了[Alibaba-ARouter]淺談簡(jiǎn)單好用的Android頁(yè)面路由框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android實(shí)現(xiàn)底部對(duì)話框BottomDialog彈出實(shí)例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)底部對(duì)話框BottomDialog代碼。這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-03-03Android編程實(shí)現(xiàn)通話錄音功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)通話錄音功能的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android廣播接收機(jī)制實(shí)現(xiàn)錄音功能的操作技巧,需要的朋友可以參考下2017-06-06