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

时间:2013-07-28 17:41:57

标签: android

我知道对“如何做到这一点”的问题非常不满,但这次我没有看到解决方法。

我是一位经验丰富且专业的Android开发人员,所以我觉得这个问题真的很傻,但我刚刚安装了this app 它做了我认为不可能的事情。

即,它会监听屏幕手势(在这种情况下,从屏幕边缘向内滑动)无论您在设备上的位置......意味着,当您在Launcher主屏幕上时,它会监听在其他应用程序中......无论你正在做什么,它都在聆听,当它检测到从屏幕边缘滑动时,它会让你带出一个隐藏的设置抽屉,然后它就像一个透明的(片段?对话框)? )View除了你所在的任何其他应用程序之外,当被解雇时(通过回击)离开你在你以前的任何地方。

老实说,我不知道这是怎么可能的,并且真的很想在正确的方向上轻推。 [编辑] enter image description here

2 个答案:

答案 0 :(得分: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
    
  2. 让应用程序保持活力。为此,您需要创建一个在前台运行的服务,这意味着它使用通知。 here's a link

  3. 有很多应用程序具备此功能。我见过的第一个是AirCalc

答案 1 :(得分:3)

现在这被认为是安装在Android 4.0.3+中的安全漏洞:问题:TYPE_SYSTEM_OVERLAY in ICS这被称为tapjacking。恕我直言,现在应该避免创建依赖于此功能的东西,因为如果在将来的版本中找到其他方法,它现在正式修补。但是,这个问题确实有一个答案,告诉你如何在4.0.3+中做到这一点如果你确实选择走这条路线,那么请注意你的能力可能会随着新版本的Android而消失。