Обнаружение жестов без блокировки других приложений

Я хочу создать системное оверлейное представление, которое обнаруживает жесты, не блокируя другие приложения. Как мне это сделать (такие приложения, как OmniSwipe, Easy Swipe обнаруживают жесты, ничего не блокируя)? Ниже приведен код, который блокирует другие приложения, вызывая системное наложение.

package com.carxsing.anglelockscreen.GestureDetector;

public class GestureService extends Service implements 
  GestureOverlayView.OnGesturePerformedListener{

  private WindowManager windowManager;
  private GestureOverlayView GestureOverlay, GestureOverlay2;
  private GestureLibrary mGestureLib;

public GestureService() {
}

@Override public IBinder onBind(Intent intent) {
    return null;
}

@Override public void onCreate() {
    super.onCreate();
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    GestureOverlay = new GestureOverlayView(this);
    GestureOverlay2 = new GestureOverlayView(this);
    GestureOverlay.setGestureColor(00000000);
    GestureOverlay.setUncertainGestureColor(00000000);
    GestureOverlay2.setGestureColor(00000000);
    GestureOverlay2.setUncertainGestureColor(00000000);
    GestureOverlay.addOnGesturePerformedListener(this);
    GestureOverlay2.addOnGesturePerformedListener(this);
    mGestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
    if (!mGestureLib.load()) {
        mGestureLib.save();
    }
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    params.height = 450;
    params.width = 75;
    params.gravity = Gravity.BOTTOM | Gravity.LEFT;
    windowManager.addView(GestureOverlay, params);
    params.height = 450;
    params.width = 75;
    params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
    windowManager.addView(GestureOverlay2, params);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if (GestureOverlay != null) windowManager.removeView(GestureOverlay);
    if (GestureOverlay2 != null) windowManager.removeView(GestureOverlay2);
}
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList<Prediction> predictions = mGestureLib.recognize(gesture);
    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);
        if (prediction.score > 1.0) {
            if (prediction.name.equals(Gestures.bottomleft) || prediction.name.equals(Gestures.bottomright)) {
                Intent i = new Intent(GestureService.this, LockScreenActivity.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("start", 1);
                startActivity(i);
            }
        }
    }
}

}


person Anton Kurashkevich    schedule 07.05.2017    source источник
comment
Такие приложения, как OmniSwipe и Easy Swipe, обнаруживают жесты, ничего не блокируя. Если эти жесты могут выполняться где угодно и когда угодно, это проблема безопасности, поскольку приложения не должны одновременно перехватывать сенсорные события и разрешать эти события продолжаются в основных окнах. Если эти жесты должны быть инициированы из какой-то горячей точки на экране, то они, вероятно, просто используют решение в стиле чат-голов.   -  person CommonsWare    schedule 07.05.2017
comment
@CommonsWare в этих приложениях обнаруживает жесты из определенного места на экране. Что делать?   -  person Anton Kurashkevich    schedule 07.05.2017
comment
Я буду удивлен, если наложение жестов будет работать. Вам, вероятно, придется иметь дело с низкоуровневыми сенсорными событиями самостоятельно.   -  person CommonsWare    schedule 07.05.2017
comment
@CommonsWare, что такое сенсорные события низкого уровня?   -  person Anton Kurashkevich    schedule 09.05.2017