Обнаружение сенсорных событий в оверлее и их дальнейшая передача

Я хочу сделать 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.

Другие вопросы по тегам