2012-08-14 7 views
8

フレームワークのいくつかの部分はまだ私には明らかではありません。私は入力イベント(Kernel - > Eventhub - > InputReader - > InputDispatcher - > ...)の流れでよく知られています。Android Key Handling(フレームワーク)

状況

(要件:Androidのフレームワークを変更することなく、入力キーを処理します)私は、デバイス(キーボード/ゲームパッド/コントローラー/ ...)しかしからのキーイベントを処理したい ありいくつかの要件があります。 1つは、Androidのフレームワークを変更したくないということです。つまり、私はWindowManagerPolicyとその機能をinterceptKeyBeforeDispatchingのように延長したくないのです。ホームキーが扱われています。これにより、キーイベントがアプリケーションレイヤーにディスパッチされ、うまくいきます。欠点は、私は別のトリッキーな要件があることです。 例:Angry Birdsを再生しているときに、接続された入力デバイスでGoToAlphaボタンを押すと、Alphaアプリケーションが起動する必要があります。 Angry Birdsには、GoToAlphaボタンが処理/認識されないなどのヒントはありません。たとえば、Alphaアプリケーションを起動する意図はありません。

質問

は、それがディスパッチされた後、私の(カスタム)キーイベントを処理する方法は、フォアグラウンドでアプリケーションがキーを扱うことができないことを知って、ありますか?

マイ(失敗)ソリューション

  • キーイベントを処理するサービスを作成します。 Angry Birdsのようなアプリケーションは私のサービスにバインドされず、キーイベントは私のサービスの中で捕捉されないので、これは不可能です。私が間違っている場合、より多くの情報を提供してください:)。

  • 私のアプリケーションのアクティビティが自分自身のActivityBaseから継承できるようにする外部ライブラリを作成します。すべてのキーイベントとデフォルトの動作がここで処理できます。残念ながら、既存のアプリケーションは、ライブラリを使用していないため、カスタムキーイベントをサポートしません。

  • フレームワークを拡張すると、私の目では最もクリーンな解決策になりますが、それは自分の要求を満たしていないことになります。

最初の質問は一つの方法または別に解決することができれば任意のヘルプや有用な情報は、..私は が私をカスタマイズしたい

エクストラ

をいただければ幸いですGoToAlphaボタンの後ろのIntent。つまり、 デフォルトでは、Alphaアプリケーションが起動されますが、ユーザーに がカスタマイズされた後、ベータアプリケーションは今から開始されます.. Any thoughts?

おかげ

+0

他のアプリケーションからキーイベントを取得することは可能でしょうか?私はこれがセキュリティリスク – Boy

+0

本当であると思います。キーイベントがフレームワークを離れると、それは1つのアプリケーションのみに移動し、そこで処理されます。そうでなければ、フレームワークに返されます。これは、両方の要件を満たすソリューションがないことを意味しますか? – DroidBender

+0

私の意見では、セキュリティ上の問題のために、おそらく方法はありません:あなたのアプリケーションに焦点が当てられていない間に主要なイベントを処理する。もしあなたがAndroidキーボードを実装しているのであれば、唯一の方法だろうか?これはキーイベントを処理できるはずです(サードパーティのキーボードを選択すると、ユーザーはこのセキュリティリスクを指摘します) – Boy

答えて

3

ビクターに感謝します。

InputMethodServiceを使用しても、私の問題を処理するのに十分な自由度と機能は提供されません。

マイソリューション/妥協

Androidの枠組みの中で、InputEventsを処理する責任を負っているPhoneWindowManagerがあります。 SystemServerによって開始されるWindowManagerServiceは、このマネージャの所有者であり、インスタンスを作成します。

独自のカスタムWindowManagerを作成し、それをAndroidのPhoneWindowManagerから継承させることで、デフォルトの機能は失われず、このクラス内に独自の実装を追加できます。この結果、新しいファイルがフレームワークに追加され、Androidフレームワーク内の1行だけが変更されます。WindowManagerServicePhoneWindowManagerを作成しませんが、CustomPhoneWindowManager(PhoneWindowManagerを拡張)を作成します。

誰かがより良い解決策を見たり、自分の妥協点について具体的な考えを持っている場合は、躊躇しないでコメントしてください。 :)

+0

もう1つ考えてください。どこかで聞いたことがあるが、どこで何が結果になったのか覚えていない。あなたはすべてのウィンドウの上に座る透明なウィンドウを作成しようとすることができるので、すべてのクリック/キーボード入力を受け取ります。そして今、アプリケーションに送る必要があります。この方法で、問題を「すべての入力を受け取る」から他のアプリにクリックを送信するように変更できます。 –

+1

これはかなり危険なアプローチです。Victorは、いくつかのセキュリティ基準と衝突しないだろうか?:)別の問題は、フレームワーク内で捕捉され、アプリケーション層にディスパッチされない 'InputEvents'(KEYCODE_HOMEに似ています)です。これらの出来事は目に見えない窓にも届かないでしょう。ご協力ありがとうございました! – DroidBender

+0

ああ..ええ..危険です:)しかし、私は、ビジネス上の価値がセキュリティの懸念の80%を上回ると考えています。私はInputMethodService全体で非常に限られた洞察力を持っています。 –

0

私は、パブリックAPIの(ボーイとマルタインは、セキュリティ上の懸念を指摘した)でそれが可能だと疑います。

(あなたがアンドロイドをカスタマイズしたくない場合)になりますあなたの最高の賭けのようなほとんどの

A)InputMethodServiceを使用してみてください(http://developer.android.com/reference/android/inputmethodservice/InputMethodService .html)

それはあなたが望むようなコントロールを与えませんが、いくつかのニーズには十分である可能性があります。

b)スタック全体(カーネルからアプリケーション)を試して、使用するいくつかの脆弱性を見つけてください。

これは間違いなく時間がかかり、果物を持っていくことを保証しません。