检测覆盖层中的触摸事件并进一步传递它们
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.
以来,出于隐私和安全原因,这已被阻止
我想制作一个 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.
以来,出于隐私和安全原因,这已被阻止