2012-08-14 77 views
8

框架的一些部分對我來說還不是很清楚。我熟知輸入事件的流程(內核 - > Eventhub - > InputReader - > InputDispatcher - > ...)。Android鍵處理(框架)

形勢

(要求:處理輸入鍵在不改變Android框架) 我想處理從設備(鍵盤/遊戲手柄/控制器/ ...),但未來的關鍵事件有是一些要求。首先,我不想更改Android框架。這意味着,我不想擴展WindowManagerPolicy及其功能,如interceptKeyBeforeDispatching,其中家庭密鑰正在處理。這將導致關鍵事件被分派到應用程序層,這很好。缺點是,我在這裏有另一個棘手的要求。 示例:當我在玩憤怒的小鳥時,我在連接的輸入設備上按下GoToAlpha按鈕時,Alpha應用程序必須啓動。憤怒的小鳥不知道哪個按鈕是GoToAlpha,不會處理/識別它,並且例如沒有意圖廣播來啓動我的Alpha應用程序。

問題

有沒有一種方式,它被分派後處理我的(自定義)按鍵事件,知道在前臺的應用程序無法處理的關鍵?

我的(失敗的)解決方案

  • 創建一個將處理的關鍵事件的服務。這是不可能的,因爲像憤怒的小鳥這樣的應用程序不會綁定到我的服務上,關鍵事件不會被我的服務所捕獲。如果我錯了,請提供更多信息:)。

  • 創建一個外部庫,允許我的應用程序的活動從我自己的ActivityBase繼承。所有關鍵事件和默認行爲都可以在這裏處理。缺點是,現有的應用程序不會支持我的自定義關鍵事件,因爲它們不使用庫。

  • 擴展框架將在我眼中是最乾淨的解決方案,但這將導致不符合我的要求。

任何幫助或有用的信息,將不勝感激

額外

如果第一個問題可以在這樣或那樣的..可以解決我想 定製我的GoToAlpha按鈕後面的Intent。這意味着..通過 默認的Alpha應用程序將啓動,但用戶有 定製它後,Beta應用程序將從現在開始..任何 的想法?

感謝

+0

如果可以從其他應用程序捕獲關鍵事件,這不是很奇怪嗎?我想這會是一個安全風險 – Boy 2012-08-14 08:25:39

+0

是真的。一旦關鍵事件離開框架,它將只發送到一個應用程序並在那裏處理。如果不是,則返回到框架。這意味着沒有解決方案可以滿足我的要求? – DroidBender 2012-08-14 08:32:13

+0

在我看來,僅僅因爲安全問題,可能沒有辦法:處理關鍵事件,而您的應用程序沒有焦點。也許唯一的辦法是如果你實現一個Android鍵盤(我沒有知道這一點)?這應該能夠處理關鍵事件(當你選擇第三方鍵盤時,用戶也會指出這種安全風險) – Boy 2012-08-14 08:45:11

回答

3

感謝您對Victor的評論。

使用InputMethodService將不會爲我提供足夠的自由度和功能來處理我的問題。

我的解決方案/妥協

在Android框架,有一個PhoneWindowManager負責處理InputEvents。由SystemServer啓動的WindowManagerService是該經理的所有者並創建實例。

通過創建我自己的自定義WindowManager並讓它繼承Android的PhoneWindowManager,我不會失去任何默認功能,這使我可以在此類中添加自己的實現。這個結果是向框架中添加一個新文件,並在Android Framework中只更改一行:WindowManagerService不會創建PhoneWindowManager,但會創建一個CustomPhoneWindowManager(擴展PhoneWindowManager)。

如果有人看到更好的解決方案或對我的妥協有任何具體的想法,請不要猶豫,以評論。 :)

+0

還有一個想法。我在某處聽說過它,但我不記得結果在哪裏,結果如何。您可以嘗試創建透明窗口,該窗口將位於所有窗口之上,因此您將收到所有點擊/鍵盤輸入。而現在,您需要將它發送給應用程序就在您的後面。這樣,您可以將問題從「接收所有輸入」更改爲將點擊發送到其他應用程序。 – 2012-08-23 17:20:55

+1

這是一個相當危險的方法維克多,不會與一些安全標準衝突:)?另一個問題是,有些InputEvents(類似於KEYCODE_HOME)在框架內被捕獲,並且不會被分派到應用層。這些事件甚至不會到達無形的窗口。感謝您的支持! – DroidBender 2012-08-24 07:18:08

+0

噢..是的..這很危險:)但是,我相信商業價值勝過80%的時間安全問題。我對整個InputMethodService的洞察力非常有限(只知道它的存在)。 – 2012-08-24 15:19:12

0

我懷疑這可能與公共的API(男孩和馬亭指出,安全問題)。

最喜歡你最好的賭注(如果你不希望自定義Android設備)將

一)儘量使用InputMethodService(http://developer.android.com/reference/android/inputmethodservice/InputMethodService .html)

它不會給你想要的那種控制,但它可能足夠滿足一些需求。

b)嘗試通過整個堆棧(從內核到應用程序)並找到一些使用的漏洞。

這絕對會花費很多時間,並不保證帶來任何成果。