一、序
Hi,大家好,我是承香墨影!
智能電視或者智能盒子,不知道大家了解多少?
這兩年各大廠商生產的電視設備,基本上都是搭載的 Android 系統。既然電視本身就是 Android 系統的,我們也可以在上面做一些很有意思的小玩意。
今天給大家推薦的就是一個可以通過手機控制智能電視的 App,當然,拿出來說它肯定是已經開源了。
App 名稱:TvRemoteIME
雖然針對智能電視,市面上已經有很多免費的商業應用,例如:悟空遙控器、快點投屏等,這些已經非常好用了,但是開源的項目依然值得我們借鑒和研究。
二、TvRemoteIME
TvRemoteIME 本身除了基本的控制之外,還包含了一些例如:App 的安裝和運行、視頻播放、文件系統瀏覽和下載等功能。
想要體驗又不想自己打包的同學,可以在 Github 上下載最新版本 Apk 的安裝包。
https://github.com/kingthy/TVRemoteIME/raw/master/released/IMEService-release.apk
TvRemoteIME 從名字就可以看出來,它其實是把自己包裝成一個輸入法,使用它需要把自己設備的默認輸入法設置成它。這樣的設定其實有很多個好處,例如:輸入法能拿到一些輸入以及按鍵相關的權限,還有就是保活的問題,一般輸入法的服務不會被系統輕易殺掉。
體驗 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 主要的幾個功能:
- 按鍵控制
- 文件瀏覽(安裝、目錄、打開)
- 視頻播放
接下來分析它主要的幾個功能。
3.1 通信
首先要確定一點,TvRemoteIME 只有一個輸入法,而要控制它其實是去訪問 TvRemoteIME 提供的一個本地 Http 服務。
從文檔和代碼中可以看到,這個服務是基於 NanoHTTPD 這個開源項目的。它是一個簡單的 HTTP 服務器,簡單到只需要一個文件就可以提供完整的 Http 服務,可以說非常的好用。
TvRemoteIME 的所有通信操作,都是基於 NanoHTTPD 的,例如:提供操作頁面、通信、上傳下載文件等等。它可以算是 TvRemoteIME 的基礎。
3.2 控制
前面也提到了,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;
}
3.3 視頻播放
視頻播放功能的播放器,也是基於另外一個開源項目 AFAP Player ,內部采用的 ijkPlayer 來實現。
通過 NanoHTTPD 傳遞過來的播放地址,然后直接傳遞給播放器去播放即可。
看文檔唯一讓我覺得有亮點的地方說是可以支持 thunder/ed2k
協議的視頻,也是基於另外一個開源項目 MiniThunder 來實現的,不過實際操作起來不是很穩定,有一些可以正常播放。
四、TvRemoteIME 的不足
TvRemoteIME 其實作為一個研究項目,已經算是可以了,並且只需要一個輸入法 App,簡單設置一下,並不需要再在手機上安裝其他 App,這樣 Android 和 iOS 都可以通用。
但是我這里算是雞蛋里挑骨頭,說一下它的不足。
依賴輸入法
核心功能嚴重依賴輸入法,例如:按鍵控制、輸入、保活等等。
輸入法本身這個思路是挺好的,這樣可以讓我們少思考很多問題。但是在現階段我了解的情況,很多傳統廠商生產的智能電視,其實是無法設置輸入法的,這樣基本上切斷了使用的唯一途徑。甚至安裝第三方 App 就已經是很難了,哪怕安裝上,你也無法將它設置為系統輸入法。
在無法和其他輸入法兼容使用的情況下,吐槽一下 TvRemoteIME 輸入法的 UI 有點丑。
除了依賴輸入法服務之外,其他的思路基本上是正確的,也沒什么好挑剔的地方。
最近,作者又更新的 TvRemoteIME,現在可以不依賴輸入法就可以使用,但是不設置輸入法,無法使用控制相關的功能。這樣其實對整個 App 的功能來說是致命的,后期還需要考慮如何做到保活和控制的問題。
四、小結
整體來說 TvRemoteIME 還算是一個比較健全的項目,如果有興趣學習研究,還是可以看看源碼的。
不過日常使用的話,還是推薦一些免費的商業 App。
例如:
- 悟空遙控器:無需輸入法,全線控制,App 管理、視頻內容也很全面。
- 快點投屏:無需TV端,基於 AirPlay 和 DLNA 實現手機控制電視直接播放。
這兩個 App,基本上滿足我的日常需要。
你對 Android 智能電視有什么看法?不妨在留言區討論。
今天在公眾號后台回復成長『成長』,將會得到我整理的一些學習資料,也能回復『加群』,一起學習進步。
推薦閱讀:
- 漫畫:程序員,你能“管理”好你的產品經理嗎?
- 官方新出的 Kotlin 擴展庫 KTX
- 不懂批判性思維,可能正在限制你的程序員生涯
- Android 開發,遇上 Emoji 頭疼嗎?
- Andorid 簽名和多渠道打包方案 | VasDolly