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

Android 检测覆盖中的触摸事件并进一步传递它们,android,service,kotlin,overlay,Android,Service,Kotlin,Overlay,我想制作一个叠加手势检测器,它将显示在所有其他应用程序之上。 覆盖将从服务启动 我制作了一个示例服务,只是为了检查是否可以通过某种方式记录覆盖图标的触摸事件,并将其发送到当前活动的应用程序: class GestureDetectorService : Service() { override fun onBind(intent: Intent?): IBinder? = null val windowManager: WindowManager get() = getSystemSe

我想制作一个
叠加
手势检测器,它将显示在所有其他应用程序之上。 覆盖将从
服务启动

我制作了一个示例服务,只是为了检查是否可以通过某种方式记录覆盖图标的触摸事件,并将其发送到当前活动的应用程序:

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) }
}
}
不走运

比如说,我想检测用户何时以一定的速度进行
投掷,或在屏幕上“绘制”特定形状,这将触发记事本的启动

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


用Kotlin给出简洁的答案会非常好,但如果你能用Java提出一些东西,那也将非常好。

幸运的是,这是不可能的,除非是在根设备上或通过自定义固件


您所描述的是窃听攻击:监视用户输入,同时传递相同的输入,以使其具有正常效果。自Android 4.0以来,出于隐私和安全原因,这一功能一直被阻止。

幸运的是,这是不可能的,除非是在根设备上或通过自定义固件


您所描述的是窃听攻击:监视用户输入,同时传递相同的输入,以使其具有正常效果。自安卓4.0以来,出于隐私和安全原因,此功能已被阻止。

感谢您的快速回复。我在想,也许这不是什么稀奇的事情,我们有各种各样的应用程序在其他应用程序之上,比如RedMoon或Messenger springy contact heads。所以我知道你可以在屏幕上画一些东西,但不接受触摸,或者画一些东西并接受触摸,但它们不会被进一步传播?有什么解决办法吗?或者这肯定会永远被阻止?@laszlo:“所以我知道你可以在屏幕上画一些东西,但不接受触摸,或者画一些东西并接受触摸,但它们不会被进一步传播?”——正确。“有什么解决办法吗”--我当然希望没有,因为那会代表一个安全漏洞。谢谢你的快速回答。我在想,也许这不是什么稀奇的事情,我们有各种各样的应用程序在其他应用程序之上,比如RedMoon或Messenger springy contact heads。所以我知道你可以在屏幕上画一些东西,但不接受触摸,或者画一些东西并接受触摸,但它们不会被进一步传播?有什么解决办法吗?或者这肯定会永远被阻止?@laszlo:“所以我知道你可以在屏幕上画一些东西,但不接受触摸,或者画一些东西并接受触摸,但它们不会被进一步传播?”——正确。“有什么解决办法吗”--我当然希望没有,因为那将代表一个安全缺陷。