【Android】TV端項(xiàng)目開(kāi)發(fā)挖坑總結(jié)

最近完成了一個(gè)TV端的項(xiàng)目,大致包括影視凌受、直播觀看阵子,手機(jī)投屏操控,內(nèi)容分類(lèi)推薦等功能胜蛉,解決了一些坑挠进,但同時(shí)也挖了好多(逃(●'?'●),在此簡(jiǎn)單記錄一下

1.foucus焦點(diǎn)問(wèn)題:

簡(jiǎn)單基礎(chǔ)的view通過(guò)android:focusable="true"誊册、android:nextFocusLeft=""领突、設(shè)置selector背景等屬性就可以搞定,但如果你要實(shí)現(xiàn)復(fù)雜布局(或者嵌套布局)的recyclerview或者listview案怯,那就需要自己重寫(xiě)事件處理了君旦。當(dāng)然你和我一樣懶得話,可以使用google的leanback庫(kù)嘲碱,不過(guò)這樣可客制化的空間就變小了金砍,個(gè)人也不是很推薦使用吧,有利有弊麦锯,具體怎樣使用下面解釋恕稠。

2.播放器IjkPlayer問(wèn)題

主要就是so庫(kù)蛋疼的編譯問(wèn)題。扶欣。鹅巍。如果你是windows電腦的話基本可以不用自己編譯了千扶,可以在這做一回伸手黨拿到so庫(kù),接下來(lái)就是自己把IjkPlayer封裝成一個(gè)自定義的framelayout昆著,根據(jù)需求處理其各種回調(diào)(緩沖县貌、暫停术陶、啟動(dòng)凑懂、重播、后臺(tái)梧宫、出錯(cuò)接谨、完成等等),開(kāi)心的是TV端只要做一些最簡(jiǎn)單的播放操作就可以了塘匣,至于彈幕脓豪、旋轉(zhuǎn)、音量忌卤、亮度等完全不需要考慮扫夜。
播放結(jié)束后記得relase播放器即可。

3.手機(jī)投屏驰徊、操控問(wèn)題解決

采用了NSDManager+AsyncHttpServer開(kāi)源庫(kù)的方式起長(zhǎng)連接完成笤闯。簡(jiǎn)單解釋下就是:

---------------------Server(TV端)--------------------------------------------

1.后臺(tái)service起一個(gè)AsyncHttpServer

2.配置NsdServiceInfo的端口號(hào)、協(xié)議類(lèi)型棍厂、協(xié)議名等信息颗味,并注冊(cè)NSDManager Service (等待client 來(lái)掃描連接)

---------------------Client(手機(jī)端)---------------------------------------

3.注冊(cè)NsdManager.DiscoveryListener(掃描),及NsdManager.ResolveListener(掃描條件滿足后的連接listener)

4.連接socket
5.發(fā)送交互信息

連接完之后牺弹,我們就能自定義上層信息協(xié)議了(通過(guò)setStringCallback浦马,解析不同string完成不同操作)。比如說(shuō)用戶token傳遞张漂、投屏影片url傳遞晶默,完全只需要加密過(guò)后以string的方式傳遞過(guò)來(lái),server解析后跳轉(zhuǎn)對(duì)應(yīng)界面就行了航攒。至于遠(yuǎn)程遙控功能荤胁,目前我是使用Instrumentation來(lái)發(fā)送虛擬按鍵,從而完成手機(jī)遙控屎债。

4.界面展示與網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)

由于TV端一般都是采用tab標(biāo)簽+fragment的形式仅政,而且數(shù)據(jù)一般不會(huì)短時(shí)間內(nèi)變化,所以最好不要頻繁刷新數(shù)據(jù)與view盆驹,請(qǐng)求一次后如果沒(méi)有觸發(fā)刷新事件圆丹,你就可以一直用這次的response,fragment也只需要hide即可躯喇。

5.leanback相關(guān)使用問(wèn)題

主要是針對(duì)VerticalGridFragment的定制辫封,實(shí)現(xiàn)這樣一個(gè)界面硝枉,并可以將focus移動(dòng)到上方tab的位置。

我的收藏.png

官方demo也比較清楚倦微,要實(shí)現(xiàn)這樣一個(gè)效果妻味,只需要照著它的模板去實(shí)現(xiàn)一個(gè)PresenterSelector(如果只有一種viewtype,直接提供一個(gè)Presenter即可)和ArrayObjectAdapter即可欣福,將網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)add進(jìn)adapter就會(huì)自動(dòng)去notify责球,主要是一些UI細(xì)節(jié)方面需要我們?nèi)ジ淖儭?/p>

  • 加載數(shù)據(jù)前后loading界面:
getProgressBarManager().show();
getProgressBarManager().hide();
  • 設(shè)置列數(shù),行間距:
/**
 * Created by lucky on 2017/7/17.
 */
public class CustomVerticalGridPresenter extends VerticalGridPresenter {
    private VerticalGridView gridView;

    public CustomVerticalGridPresenter(int focusZoomFactor) {
        super(focusZoomFactor);
    }

    @Override
    protected void initializeGridViewHolder(ViewHolder vh) {
        super.initializeGridViewHolder(vh);
        gridView= vh.getGridView();
        int top= DensityUtil.dip2px(vh.getGridView().getContext(),25);//this is the new value for top padding
        int bottom= gridView.getPaddingBottom();
        int right= gridView.getPaddingRight();
        int left= gridView.getPaddingLeft();
        gridView.setPadding(left+top,top,right+top,bottom+top);
        gridView.setHorizontalSpacing(top);
        gridView.setVerticalSpacing(top);

    }
}

接著在VerticalGridFragment中:

CustomVerticalGridPresenter gridPresenter = new       
CustomVerticalGridPresenter(ZOOM_FACTOR);
gridPresenter.setNumberOfColumns(COLUMNS);
setGridPresenter(gridPresenter);
  • VerticalGridFragment頂層控件不能向上導(dǎo)航focus拓劝,如上圖中焦點(diǎn)無(wú)法移動(dòng)到我的收藏那一行item:

可以重寫(xiě)一個(gè)一模一樣的lb_vertical_grid_fragment雏逾,自己寫(xiě)的布局會(huì)覆蓋掉系統(tǒng)的布局,再將BrowseFrameLayout重寫(xiě)成我們自己的BrowseFrameLayout郑临。

主要是因?yàn)閂erticalGridFragment中的父布局?jǐn)r截了事件栖博,詳細(xì)原因可以看這

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厢洞,隨后出現(xiàn)的幾起案子仇让,更是在濱河造成了極大的恐慌,老刑警劉巖躺翻,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧叽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡获枝,警方通過(guò)查閱死者的電腦和手機(jī)蠢正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)省店,“玉大人嚣崭,你說(shuō)我怎么就攤上這事∨嘲” “怎么了雹舀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粗俱。 經(jīng)常有香客問(wèn)我说榆,道長(zhǎng),這世上最難降的妖魔是什么寸认? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任签财,我火速辦了婚禮,結(jié)果婚禮上偏塞,老公的妹妹穿的比我還像新娘唱蒸。我一直安慰自己,他們只是感情好灸叼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布神汹。 她就那樣靜靜地躺著庆捺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屁魏。 梳的紋絲不亂的頭發(fā)上滔以,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音氓拼,去河邊找鬼你画。 笑死,一個(gè)胖子當(dāng)著我的面吹牛披诗,可吹牛的內(nèi)容都是我干的撬即。 我是一名探鬼主播立磁,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呈队,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唱歧?” 一聲冷哼從身側(cè)響起宪摧,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颅崩,沒(méi)想到半個(gè)月后几于,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沿后,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年沿彭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尖滚。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喉刘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漆弄,到底是詐尸還是另有隱情睦裳,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布撼唾,位于F島的核電站廉邑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏倒谷。R本人自食惡果不足惜蛛蒙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渤愁。 院中可真熱鬧牵祟,春花似錦、人聲如沸猴伶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筝尾,卻和暖如春捡需,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筹淫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工站辉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人损姜。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓饰剥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摧阅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汰蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容