如何在自己的应用程序之外检测屏幕手势?

Gen*_* S. 5 android

我知道 SO 对“我该怎么做”的问题非常不满,但这次我没有找到解决办法。

我是一个经验丰富的专家 Android 开发人员,所以我觉得问这个问题真的很傻,但我刚刚安装了这个应用程序 ,它做了一些我认为不可能的事情。

也就是说,它会监听屏幕手势(在这种情况下是从屏幕边缘向内滑动),无论您在设备上的哪个位置......意思是,它会在您在 Launcher 主屏幕上以及当您在其他应用程序......无论你在做什么,它都在监听,当它检测到从屏幕边缘滑动时,它会让你带出一个隐藏的设置抽屉,然后作为一个透明的(片段?对话框?)View在顶部您在使用的任何其他应用程序以及在被解雇时(通过按 BACK 键)会让您在之前的体验中处于任何位置。

老实说,我不知道这是怎么可能的,并且真的很想朝正确的方向推动。[编辑]在此处输入图片说明

and*_*per 4

有两件事你必须处理:

  1. 显示顶部视图。为此,您需要使用特殊权限TYPE_SYSTEM_ALERT。这是在顶部显示视图的代码:

    final WindowManager.LayoutParams param=new WindowManager.LayoutParams();
    param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    final View view=findViewById(R.id.view1);
    final ViewGroup parent=(ViewGroup)view.getParent();
    if(parent!=null)
      parent.removeView(view);
    param.format=PixelFormat.RGBA_8888;
    param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    param.gravity=Gravity.TOP|Gravity.LEFT;
    param.width=view.getLayoutParams().width;
    param.height=view.getLayoutParams().height;
    final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    wmgr.addView(view,param);
    // TODO handle overlapping title bar and/or action bar
    // TODO you must add logic to remove the view
    // TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW
    
    Run Code Online (Sandbox Code Playgroud)
  2. 保持应用程序的活力。为此,您需要创建一个在前台运行的服务,这意味着它使用通知。这是一个链接

有很多应用程序具有此功能。我看到的第一个是AirCalc