遠程控制你的智能電視,按鍵|輸入|安裝App等都已實現,已開源!

1、序

Hi,你們好,我是承香墨影!java

智能電視或者智能盒子,不知道你們瞭解多少?android

這兩年各大廠商生產的電視設備,基本上都是搭載的 Android 系統。既然電視自己就是 Android 系統的,咱們也能夠在上面作一些頗有意思的小玩意。git

今天給你們推薦的就是一個能夠經過手機控制智能電視的 App,固然,拿出來講它確定是已經開源了。程序員

App 名稱:TvRemoteIMEgithub

https://github.com/kingthy/TVRemoteIMEshell

雖然針對智能電視,市面上已經有不少免費的商業應用,例如:悟空遙控器、快點投屏等,這些已經很是好用了,可是開源的項目依然值得咱們借鑑和研究。瀏覽器

2、TvRemoteIME

TvRemoteIME 自己除了基本的控制以外,還包含了一些例如:App 的安裝和運行、視頻播放、文件系統瀏覽和下載等功能。服務器

想要體驗又不想本身打包的同窗,能夠在 Github 上下載最新版本 Apk 的安裝包。學習

https://github.com/kingthy/TVRemoteIME/raw/master/released/IMEService-release.apk3d

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 服務,均可以對其進行控制。

3、TvRemoteIME 的原理

TvRemoteIME 主要的幾個功能:

  1. 按鍵控制
  2. 文件瀏覽(安裝、目錄、打開)
  3. 視頻播放

接下來分析它主要的幾個功能。

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 來實現的,不過實際操做起來不是很穩定,有一些能夠正常播放。

4、TvRemoteIME 的不足

TvRemoteIME 其實做爲一個研究項目,已經算是能夠了,而且只須要一個輸入法 App,簡單設置一下,並不須要再在手機上安裝其餘 App,這樣 Android 和 iOS 均可以通用。

可是我這裏算是雞蛋裏挑骨頭,說一下它的不足。

依賴輸入法

核心功能嚴重依賴輸入法,例如:按鍵控制、輸入、保活等等。

輸入法自己這個思路是挺好的,這樣可讓咱們少思考不少問題。可是在現階段我瞭解的狀況,不少傳統廠商生產的智能電視,實際上是沒法設置輸入法的,這樣基本上切斷了使用的惟一途徑。甚至安裝第三方 App 就已是很難了,哪怕安裝上,你也沒法將它設置爲系統輸入法。

在沒法和其餘輸入法兼容使用的狀況下,吐槽一下 TvRemoteIME 輸入法的 UI 有點醜。

除了依賴輸入法服務以外,其餘的思路基本上是正確的,也沒什麼好挑剔的地方。

最近,做者又更新的 TvRemoteIME,如今能夠不依賴輸入法就可使用,可是不設置輸入法,沒法使用控制相關的功能。這樣其實對整個 App 的功能來講是致命的,後期還須要考慮如何作到保活和控制的問題。

4、小結

總體來講 TvRemoteIME 還算是一個比較健全的項目,若是有興趣學習研究,仍是能夠看看源碼的。

不過平常使用的話,仍是推薦一些免費的商業 App。

例如:

  • 悟空遙控器:無需輸入法,全線控制,App 管理、視頻內容也很全面。
  • 快點投屏:無需TV端,基於 AirPlay 和 DLNA 實現手機控制電視直接播放。

這兩個 App,基本上知足個人平常須要。

你對 Android 智能電視有什麼見解?不妨在留言區討論。

今天在公衆號後臺回覆成長『成長』,將會獲得我整理的一些學習資料,也能回覆『加羣』,一塊兒學習進步。

推薦閱讀:

相關文章
相關標籤/搜索