【问题标题】:Android - Use SYSTEM_OVERLAY to change touch eventsAndroid - 使用 SYSTEM_OVERLAY 更改触摸事件
【发布时间】:2015-03-19 23:03:12
【问题描述】:

我的问题与this one 非常相似。 这个问题是大约 3 年前提出的,但尚未得到回答。

我的目标是使用系统覆盖捕获所有触摸事件(参见下面的代码),更改事件的参数(即 event.x = event.getX()+5)并将其传递给当前正在运行的应用程序(任何应用程序)。

目前,我可以使用 TYPE_PHONE 标志捕获所有 MotionEvent 或使用 TYPE_SYSTEM_OVERLAY 将所有事件传递给当前应用程序,但不能同时使用两者。

该应用程序用于辅助目的,因此使用任何辅助功能也是一种选择。

叠加服务的基本代码:

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;


public class OverlayService extends Service {
    OverlayView oView;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        oView = new OverlayView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.FILL_PARENT,
                WindowManager.LayoutParams.FILL_PARENT,
                WindowManager.LayoutParams.TYPE_PHONE, // TYPE_SYSTEM_OVERLAY
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
              | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
              | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER;
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(oView, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(oView != null)
        {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(oView);
            oView = null;
        }
    }

}

class OverlayView extends View {
    private Paint mLoadPaint;

    public OverlayView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
        getBackground().setAlpha(128);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){
            Toast.makeText(getContext(), "Touch", Toast.LENGTH_SHORT).show();

            //********************** THIS IS WHERE I NEED YOUR HELP *************
        }
        return false;
    }
}

任何建议将不胜感激。

【问题讨论】:

    标签: android overlay accessibility motionevent


    【解决方案1】:

    我的目标是使用系统覆盖捕获所有触摸事件(参见下面的代码),更改事件的参数(即 event.x = event.getX()+5)并将其传递给当前正在运行的应用程序(任何应用程序)。

    出于隐私和安全原因,这是不可能的。

    目前,我可以使用 TYPE_PHONE 标志捕获所有 MotionEvent 或使用 TYPE_SYSTEM_OVERLAY 将所有事件传递给当前应用程序,但不能同时使用两者。

    正确。这是 Android 4.0 中添加的用于防御窃听攻击的修复程序,无论您是否意识到,这都是您正在尝试做的事情。

    该应用程序用于辅助目的,因此使用任何辅助功能也是一种选择。

    我不能排除这种可能性,虽然我没有看到低级触摸事件in AccessibilityEvent,更不用说修改它们了。这将与您所采用的方法大相径庭,因此需要一个单独的 Stack Overflow 问题。

    【讨论】:

    • 您可以排除这种可能性。在现有的 Android 设备上无法做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2016-10-04
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多