一、序
Hi,大家好,我是承香墨影!
智慧電視或者智慧盒子,不知道大家瞭解多少?
這兩年各大廠商生產的電視裝置,基本上都是搭載的 Android 系統。既然電視本身就是 Android 系統的,我們也可以在上面做一些很有意思的小玩意。
今天給大家推薦的就是一個可以通過手機控制智慧電視的 App,當然,拿出來說它肯定是已經開源了。
App 名稱:TvRemoteIME
雖然針對智慧電視,市面上已經有很多免費的商業應用,例如:悟空遙控器、快點投屏等,這些已經非常好用了,但是開源的專案依然值得我們借鑑和研究。
二、TvRemoteIME
TvRemoteIME 本身除了基本的控制之外,還包含了一些例如:App 的安裝和執行、視訊播放、檔案系統瀏覽和下載等功能。
想要體驗又不想自己打包的同學,可以在 Github 上下載最新版本 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 服務,可以說非常的好用。
https://github.com/NanoHttpd/nanohttpd
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 智慧電視有什麼看法?不妨在留言區討論。
今天在公眾號後臺回覆成長『成長』,將會得到我整理的一些學習資料,也能回覆『加群』,一起學習進步。
推薦閱讀: