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

承香墨影發表於2018-03-06

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

一、序

Hi,大家好,我是承香墨影!

智慧電視或者智慧盒子,不知道大家瞭解多少?

這兩年各大廠商生產的電視裝置,基本上都是搭載的 Android 系統。既然電視本身就是 Android 系統的,我們也可以在上面做一些很有意思的小玩意。

今天給大家推薦的就是一個可以通過手機控制智慧電視的 App,當然,拿出來說它肯定是已經開源了。

App 名稱:TvRemoteIME

github.com/kingthy/TVR…

雖然針對智慧電視,市面上已經有很多免費的商業應用,例如:悟空遙控器、快點投屏等,這些已經非常好用了,但是開源的專案依然值得我們借鑑和研究。

二、TvRemoteIME

TvRemoteIME 本身除了基本的控制之外,還包含了一些例如:App 的安裝和執行、視訊播放、檔案系統瀏覽和下載等功能。

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

想要體驗又不想自己打包的同學,可以在 Github 上下載最新版本 Apk 的安裝包。

github.com/kingthy/TVR…

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 主要的幾個功能:

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

四、TvRemoteIME 的不足

TvRemoteIME 其實作為一個研究專案,已經算是可以了,並且只需要一個輸入法 App,簡單設定一下,並不需要再在手機上安裝其他 App,這樣 Android 和 iOS 都可以通用。

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

依賴輸入法

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

輸入法本身這個思路是挺好的,這樣可以讓我們少思考很多問題。但是在現階段我瞭解的情況,很多傳統廠商生產的智慧電視,其實是無法設定輸入法的,這樣基本上切斷了使用的唯一途徑。甚至安裝第三方 App 就已經是很難了,哪怕安裝上,你也無法將它設定為系統輸入法。

在無法和其他輸入法相容使用的情況下,吐槽一下 TvRemoteIME 輸入法的 UI 有點醜。

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

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

最近,作者又更新的 TvRemoteIME,現在可以不依賴輸入法就可以使用,但是不設定輸入法,無法使用控制相關的功能。這樣其實對整個 App 的功能來說是致命的,後期還需要考慮如何做到保活和控制的問題。

四、小結

整體來說 TvRemoteIME 還算是一個比較健全的專案,如果有興趣學習研究,還是可以看看原始碼的。

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

例如:

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

這兩個 App,基本上滿足我的日常需要。

你對 Android 智慧電視有什麼看法?不妨在留言區討論。

今天在公眾號後臺回覆成長『成長』,將會得到我整理的一些學習資料,也能回覆『加群』,一起學習進步。

推薦閱讀:

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

相關文章