Android 在不阻止其他应用程序的情况下检测手势

Android 在不阻止其他应用程序的情况下检测手势,android,gestures,layoutparams,android-windowmanager,Android,Gestures,Layoutparams,Android Windowmanager,我想创建系统覆盖视图,它可以检测手势,而不会阻止其他应用程序。我该怎么做(OmniSwipe、Easy Swipe detect手势等应用程序,无需阻止任何内容)?下面的代码,阻止其他应用程序导致系统覆盖视图 package com.carxsing.anglelockscreen.GestureDetector; public class GestureService extends Service implements GestureOverlayView.OnGesturePerf

我想创建系统覆盖视图,它可以检测手势,而不会阻止其他应用程序。我该怎么做(OmniSwipe、Easy Swipe detect手势等应用程序,无需阻止任何内容)?下面的代码,阻止其他应用程序导致系统覆盖视图

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);
            }
        }
    }
}
package com.carxsing.anglelockscreen.GestureDetector;
公共类GestureService扩展了服务实现
手势OverlayView.OnEsturePerformedListener{
专用WindowManager WindowManager;
私人手势叠加查看手势叠加,手势叠加2;
私人手势库mGestureLib;
公共手势服务(){
}
@覆盖公共IBinder onBind(意图){
返回null;
}
@重写公共void onCreate(){
super.onCreate();
windowManager=(windowManager)getSystemService(窗口服务);
GestureOverlay=新的GestureOverlayView(该视图);
GestureOverlay2=新的GestureOverlayView(本);
GestureOverlay.setGestureColor(00000000);
GestureOverlay.SetUncertiveGestureColor(00000000);
GestureOverlay2.setGestureColor(00000000);
GestureOverlay2.设置不确定性GestureColor(00000000);
GestureOverlay.AddOnTesturePerformedListener(此);
GestureOverlay2.AddOnTesturePerformedListener(此);
mGestureLib=GestureLibraries.fromRawResource(this,R.raw.bigests);
如果(!mGestureLib.load()){
mGestureLib.save();
}
WindowManager.LayoutParams params=新建WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE\系统\警报,
WindowManager.LayoutParams.FLAG_不可聚焦| WindowManager.LayoutParams.FLAG_不可触摸|,
像素格式(半透明);
参数高度=450;
参数宽度=75;
params.gravity=gravity.BOTTOM | gravity.LEFT;
windowManager.addView(GestureOverlay,参数);
参数高度=450;
参数宽度=75;
params.gravity=gravity.BOTTOM | gravity.RIGHT;
windowManager.addView(GestureOverlay2,参数);
}
@凌驾
公共空间{
super.ondestory();
如果(GestureOverlay!=null)windowManager.removeView(GestureOverlay);
如果(GestureOverlay2!=null)windowManager.removeView(GestureOverlay2);
}
已执行的检测的公共无效(手势覆盖视图覆盖、手势){
ArrayList predictions=mGestureLib.recognize(手势);
如果(预测值.size()>0){
预测=预测。获取(0);
如果(预测分数>1.0){
if(prediction.name.equals(signatures.bottomleft)| prediction.name.equals(signatures.bottomright)){
意图i=新意图(GestureService.this、LockScreenActivity.class);
i、 设置标志(意图、标志、活动、新任务);
i、 putExtra(“开始”,1);
星触觉(i);
}
}
}
}

}

“像OmniSwipe这样的应用程序,可以在不阻塞任何内容的情况下轻松滑动检测手势”——如果这些手势可以在任何时间出现在任何地方,这是一个安全问题,因为应用程序不应该既能截获触摸事件,又能允许这些事件沿着底层窗口继续。如果这些手势必须从屏幕上的某个“热点”启动,那么它们可能只是在使用“聊天头”式的解决方案。@这些应用程序中的通用软件可以从屏幕上的特定位置检测手势。怎么办?如果手势叠加的东西能起作用,我会很惊讶。您可能必须自己处理低级触摸事件。@Commonware什么是低级触摸事件?
onTouchEvent()
“像OmniSwipe这样的应用程序,可以在不阻止任何东西的情况下轻松滑动检测手势”——如果这些手势可以在任何时间出现在任何地方,这是一个安全问题,因为应用程序不应该既能拦截触摸事件,又能允许这些事件沿着底层窗口继续。如果这些手势必须从屏幕上的某个“热点”启动,那么它们可能只是在使用“聊天头”式的解决方案。@这些应用程序中的通用软件可以从屏幕上的特定位置检测手势。怎么办?如果手势叠加的东西能起作用,我会很惊讶。您可能必须自己处理低级触摸事件。@Commonware什么是低级触摸事件?
onTouchEvent()