版權宣告:
本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。
未經允許,不得轉載。
一、前言
現在 Android 智慧電視出貨量已經非常的大了,近兩年產的電視,基本上都屬於智慧電視,而很大一部分都是搭載的 Android 系統。
當然,除了智慧電視之外,還有一些智慧盒子,例如:小米盒子、天貓魔盒等,其實最終都是 Android 系統。
在國內的環境下,開發的 TV App 其實也並不是遵循的 Google TV 的開發規範,而都是當成一個普通的 Android App 來開發的。在這個過程中,實際上是需要處理一些手機和電視的差異的,例如:焦點、選中狀態、螢幕適配等等,這些有時間再細說。
如果,螢幕適配做的好的話,實際上是可以無縫在手機裝置上,執行一個原本為了 Android TV 而開發的 App。
而有些場景下,為了節約開發成本,有可能需要對一些在電視上執行的 App 做一個手機端的適配,最常見的場景,一個微信登入的功能,TV App 做的一般是提供一個二維碼,讓手機掃碼登入,但是當這個程式執行在手機端的時候,就可能需要一個按鈕,點選調起微信去登入了。
那麼,如何在同一個 App 內,區分當前執行在手機裝置上,還是電視裝置上,就尤為重要了。
二、如何區分
既然要對執行環境做一個區分,那麼就需要考慮到,手機和電視的一些差異。
手機和電視的差異性:
- 螢幕物理尺寸不同。
- 佈局尺寸不同。
- SIM 卡的狀態不同。
- 電源接入的方式不同。
1、螢幕物理尺寸
手機和電視的螢幕物理尺寸是完全不一樣的,但是我們也不能完全使用買電視的時候介紹的 Xx寸 來區分螢幕物理尺寸。實際上完全可以將 Android 電視當成一個大平板。
這裡以一個電視英寸數的計算公式,計算螢幕對角線的長度,來做一個參考的數值。
既然把電視當成一個大平板,這裡計算出來的數值,對於電視而言,基本上都是大於 6.5 的,所以以這個條件做判斷,是有一定參考價值的。
2、佈局尺寸
既然螢幕的尺寸有差異,那麼從不同的佈局中獲取佈局檔案也是不一樣的,可以通過 screenLayout 引數來區分出當前命中那一套。
規則如下:
截圖來自官方文件,有興趣的可以通篇閱讀一下。
developer.android.com/guide/pract…
而程式碼如下:
3、SIM 支援的模式
對於電視而言,就現在所瞭解到的,還沒有一款智慧電視或者智慧盒子,是可以插 SIM 卡的,所以判斷 SIM 支援的模式,基本上就可以區分出電視還是手機了。
SIM 卡支援的模式可以使用 TelephonyManager 來獲取當前的狀態。
可以看到 getPhoneType()
可以獲取當前裝置支援的 Radio 的模式。
一般而言,判斷不出來,就可以人為是一款不支援 SIM 插卡的裝置了。
4、電源的接入方式
對於電視的電源,有什麼特點?
- 永遠沒有耗電的變動,獲取到的電量永遠是滿的。
- 電源接入的方式,使用 AC 交流電,而非 USB 或者電池。
獲取當前電源和充電的接入方式,沒什麼好說的,基本上依據這兩個條件,就可以區分出當前到底是電視還是手機/平板了。
三、設計原則
這裡提供的幾點方法,其實都是猜測,都是有缺陷的。例如可能出現某些廠商的奇葩裝置,出貨螢幕尺寸就是大的手機,或者有一些奇葩的電視或者盒子,就是可以支援插 SIM 卡,再或者有其實還有一些智慧投影的裝置,其實是內帶電池的,是有電量的消耗的。
所以最穩妥的方式,就是組合起來判斷。
而這裡實際上,這款 App 依然是主要需要釋出Android 電視市場的,所以這裡的判斷,對手機進行嚴格判斷,其他的都認為是 Android TV 。這樣即便是誤判了,影響也不會太大。