Обнаружение сенсорных событий в оверлее и их дальнейшая передача
Я хочу сделать 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, это тоже было бы здорово.
1 ответ
К счастью, это невозможно, разве что на рутованных устройствах или с помощью специальной прошивки.
То, что вы описываете, - это атака с использованием крана: шпионить за пользовательским вводом, передавая тот же самый ввод, чтобы он имел нормальные эффекты. Это было заблокировано по соображениям конфиденциальности и безопасности с Android 4.0.