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

Detecting touch events in overlay and passing them further

我想制作一个 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 特定速度或 'draw' 特定形状,这将触发例如启动记事本。

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

Kotlin 的简洁答案会非常好,但如果您能在 Java 中想出一些东西,那也很棒。

幸运的是,这是不可能的,除非在已获得 root 权限的设备上或通过自定义固件。

您所描述的是窃听攻击:在传递相同输入的同时监视用户输入,以使其具有正常效果。自 Android 4.0.

以来,出于隐私和安全原因,这已被阻止