2016-05-25 7 views
0

私のアプリの外でも、ユーザーが行うすべてのタッチイベントをリッスンするための合法的な方法がAndroidにありますか?私はバックグラウンドで画面のジェスチャーを聞くサービスのようなものを持っていることを意味します。バックグラウンドでのタッチイベントを聞きます。

+0

ここからこれを得ましたhttp://stackoverflow.com/questions/6714020/how-can-a-service-listen-for-touch- gestures-events –

+0

@ GodslaveAsadよく投稿しましたが、画面上でのユーザーの操作を妨げるソリューションしか提供していません。完全に見えないままにしておきたいものです。 – Salivan

答えて

-1

アイデアは、本当に小さい(たとえば1x1ピクセル)ダミーのUIフラグメントを定義し、それを画面のコーナーの1つに配置し、その外側のすべてのタッチイベントをリッスンさせます。まあ、文字通り、それは "目に見えない"ではなく、実際には常に前景です!しかし、それはとても小さいので、うまくいけばユーザーは違いを感じることはありません。

mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
mDummyView = new LinearLayout(mContext); 

LayoutParams params = new LayoutParams(1, LayoutParams.MATCH_PARENT); 
mDummyView.setLayoutParams(params); 
mDummyView.setOnTouchListener(this); 

は、ここでは1つの画素とダミービューの幅を設定し、高さは親の高さに:

まずは、このダミーのビューを作成してみましょう。また、このダミービューのタッチイベントリッスンを設定します。これについては後で実装します。

次に、このダミービューを追加してみましょう。ここ

LayoutParams params = new LayoutParams(
    1, /* width */ 
    1, /* height */ 
    LayoutParams.TYPE_PHONE, 
    LayoutParams.FLAG_NOT_FOCUSABLE | 
    LayoutParams.FLAG_NOT_TOUCH_MODAL | 
    LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
    PixelFormat.TRANSPARENT 
    ); 
params.gravity = Gravity.LEFT | Gravity.TOP; 
mWindowManager.addView(mDummyView, params); 

キーがFLAG_WATCH_OUTSIDE_TOUCHフラグである、それはイベントがダミービュー内であるか否かを、画面上のすべてのイベントをキャプチャするためにダミーの表示を可能にします。

最後に、View.OnTouchListenerリスナーを実装してtouchイベントを処理しましょう。

@Override 
public boolean onTouch(View v, MotionEvent event) { 
Log.d(TAG, "Touch event: " + event.toString()); 

// log it 

return false; 
} 

私たちはイベントを実際に処理していないので、実際のUI要素がそれらのイベントを取得できるように、falseを返す必要があります。

最後に、ダミービューが常にタッチイベントをリスニングするようにするには、これらをすべてサービスでラップする必要があります。つまり、onCreateでダミービューを作成し、onStartCommandの画面に追加します。また、サービスはView.OnTouchListenerを実装してタッチイベントを受け取る必要があります。

Referrence は、私はあなたがこの記事からあなたの答えを取得する必要があります http://jhshi.me/2014/11/09/monitor-screen-touch-event-in-android/

+0

良い答えですが、イベントがそのダミービューの外にキャプチャされていれば間違った座標が表示されてしまい、正確にタッチが発生した場所を知る必要があります。 – Salivan

+0

このアプローチは動作しません。なぜなら、現在のコンテキストの外にあるイベントは常に0を返すからです。これはAndroid 4.3以降の変更です(ソース:https://github.com/android/platform_frameworks_base/blob/79e0206ef3203a1842949242e58fa8f3c25eb129/services/入力/ InputDispatcher.cpp#L1417) – iamseiko

関連する問題