检测覆盖中的触摸事件并进一步传递

我想做一个overlay手势检测器,将显示在所有其他应用程序之上。 覆盖将从Service启动。

我已经做了示例服务,只是为了检查触摸覆盖图标的触摸事件是否可以以某种方式记录并进一步调度到当前活动的应用程序:

 class GestureDetectorService : Service() { override fun onBind(intent: Intent?): IBinder? = null val windowManager: WindowManager get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager var iv: AppCompatImageView? = null override fun onCreate() { super.onCreate() iv = AppCompatImageView(this) iv?.setImageResource(R.drawable.icon) iv?.setOnTouchListener { view, motionEvent -> when (motionEvent.action) { MotionEvent.ACTION_DOWN -> { Log.d("Click", "From icon") false } else -> false } } val params: WindowManager.LayoutParams = WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT , WindowManager.LayoutParams.WRAP_CONTENT , WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED , PixelFormat.TRANSLUCENT) params.gravity = Gravity.TOP or Gravity.LEFT params.x = 100 params.y = 100 windowManager.addView(iv, params) } override fun onDestroy() { super.onDestroy() iv.let { windowManager.removeView(iv) } } } 

没有运气。

比方说我想要检测用户何时执行特定速度的Fling ,或者在屏幕上“绘制”某种形状,这将触发例如启动记事本。

但我不希望这些阻止正常的应用程序交互,用户必须能够与正常启动的任何应用程序进行交互。

Kotlin简洁的答案会非常好,但是如果你能用Java来想出什么东西的话,那也是非常棒的。

幸运的是,这是不可能的,除了根植设备或通过定制固件。

你所描述的是一个劫掠攻击:窥探用户输入,同时传递相同的输入,所以它有正常的效果。 自从Android 4.0以来,由于隐私和安全原因,这已被封锁。