Hi,你們好,我是承香墨影!java
智能電視或者智能盒子,不知道你們瞭解多少?android
這兩年各大廠商生產的電視設備,基本上都是搭載的 Android 系統。既然電視自己就是 Android 系統的,咱們也能夠在上面作一些頗有意思的小玩意。git
今天給你們推薦的就是一個能夠經過手機控制智能電視的 App,固然,拿出來講它確定是已經開源了。程序員
App 名稱:TvRemoteIMEgithub
雖然針對智能電視,市面上已經有不少免費的商業應用,例如:悟空遙控器、快點投屏等,這些已經很是好用了,可是開源的項目依然值得咱們借鑑和研究。瀏覽器
TvRemoteIME 自己除了基本的控制以外,還包含了一些例如:App 的安裝和運行、視頻播放、文件系統瀏覽和下載等功能。服務器
想要體驗又不想本身打包的同窗,能夠在 Github 上下載最新版本 Apk 的安裝包。學習
https://github.com/kingthy/TVRemoteIME/raw/master/released/IMEService-release.apk3d
TvRemoteIME 從名字就能夠看出來,它實際上是把本身包裝成一個輸入法,使用它須要把本身設備的默認輸入法設置成它。這樣的設定其實有不少個好處,例如:輸入法能拿到一些輸入以及按鍵相關的權限,還有就是保活的問題,通常輸入法的服務不會被系統輕易殺掉。
想要體驗的同窗能夠經過上面提供的下載地址下載,獲得 Apk 以後,再安裝到待控制的設備上,這裏能夠是一個智能電視、智能盒子或者一臺普通的 Android 手機。
安裝以後,你須要將它設置成系統的默認輸入法,若是你的設備上有設置輸入法的設置頁面,固然是能夠直接選擇的。若是沒有的話,你還能夠經過 adb 命令來進行設置。
adb shell ime set com.android.tvremoteime/.IMEService
一切設置穩當以後,就能夠經過電腦或者手機,遠程訪問控制頁面。控制頁面是一個網頁,地址就是你安裝 TvRemoteIME 的設備的 IP 地址,端口是固定的 9978
。
例如我當前的設備的 IP 是 192.168.1.199,那就是 http://192.168.1.199:9978/
。
以後你就能夠在瀏覽器中,看到前面截圖的控制頁面,開始你的體驗吧。
這樣經過一個 Http 服務器來提供操做的各類 UI,與待控制的設備上的 TvRemoteIME 輸入法程序進行通訊,再由 TvRemoteIME 去執行具體的操做邏輯。這樣的方式其實很好,全程只須要在待操做的設備上安裝一個 App,而後多端(Android、iOS、Web)經過 Http 服務,均可以對其進行控制。
TvRemoteIME 主要的幾個功能:
接下來分析它主要的幾個功能。
首先要肯定一點,TvRemoteIME 只有一個輸入法,而要控制它實際上是去訪問 TvRemoteIME 提供的一個本地 Http 服務。
從文檔和代碼中能夠看到,這個服務是基於 NanoHTTPD 這個開源項目的。它是一個簡單的 HTTP 服務器,簡單到只須要一個文件就能夠提供完整的 Http 服務,能夠說很是的好用。
TvRemoteIME 的全部通訊操做,都是基於 NanoHTTPD 的,例如:提供操做頁面、通訊、上傳下載文件等等。它能夠算是 TvRemoteIME 的基礎。
前面也提到了,TvRemoteIME 將本身包裝成一個輸入法,因此不少操做它均可以經過 InputConnection
來實現,例如按鍵的控制。
關於控制,你能夠在 IMEService 裏看到對應的邏輯。
long eventTime = SystemClock.uptimeMillis(); InputConnection ic = getCurrentInputConnection(); switch (keyAction) { case KEY_ACTION_PRESSED: sendKeyCode(kc); break; case KEY_ACTION_DOWN: if(ic != null) { ic.sendKeyEvent(new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, kc, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); } break; case KEY_ACTION_UP: if(ic != null) { ic.sendKeyEvent(new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, kc, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); } break; }
視頻播放功能的播放器,也是基於另一個開源項目 AFAP Player ,內部採用的 ijkPlayer 來實現。
經過 NanoHTTPD 傳遞過來的播放地址,而後直接傳遞給播放器去播放便可。
看文檔惟一讓我以爲有亮點的地方說是能夠支持 thunder/ed2k
協議的視頻,也是基於另一個開源項目 MiniThunder 來實現的,不過實際操做起來不是很穩定,有一些能夠正常播放。
TvRemoteIME 其實做爲一個研究項目,已經算是能夠了,而且只須要一個輸入法 App,簡單設置一下,並不須要再在手機上安裝其餘 App,這樣 Android 和 iOS 均可以通用。
可是我這裏算是雞蛋裏挑骨頭,說一下它的不足。
核心功能嚴重依賴輸入法,例如:按鍵控制、輸入、保活等等。
輸入法自己這個思路是挺好的,這樣可讓咱們少思考不少問題。可是在現階段我瞭解的狀況,不少傳統廠商生產的智能電視,實際上是沒法設置輸入法的,這樣基本上切斷了使用的惟一途徑。甚至安裝第三方 App 就已是很難了,哪怕安裝上,你也沒法將它設置爲系統輸入法。
在沒法和其餘輸入法兼容使用的狀況下,吐槽一下 TvRemoteIME 輸入法的 UI 有點醜。
除了依賴輸入法服務以外,其餘的思路基本上是正確的,也沒什麼好挑剔的地方。
最近,做者又更新的 TvRemoteIME,如今能夠不依賴輸入法就可使用,可是不設置輸入法,沒法使用控制相關的功能。這樣其實對整個 App 的功能來講是致命的,後期還須要考慮如何作到保活和控制的問題。
總體來講 TvRemoteIME 還算是一個比較健全的項目,若是有興趣學習研究,仍是能夠看看源碼的。
不過平常使用的話,仍是推薦一些免費的商業 App。
例如:
這兩個 App,基本上知足個人平常須要。
你對 Android 智能電視有什麼見解?不妨在留言區討論。
今天在公衆號後臺回覆成長『成長』,將會獲得我整理的一些學習資料,也能回覆『加羣』,一塊兒學習進步。
推薦閱讀: