java - 如何在后台服务中检测视图之外的触摸事件?
问题描述
我试图在后台服务中检测触摸事件,以便在用户使用任何应用程序时获取所有触摸事件。
我所做的是使用 WindowManager 添加一个小视图,当在后台运行应用程序时,这个小视图仍然可以在屏幕上。我还将视图设置为 onTouchListener,因此当用户在视图内触摸时,我可以获得触摸事件。
我的问题是有没有办法在这个小视图之外检测触摸事件。
这是我的代码。
public class GlobalTouchService extends Service implements View.OnTouchListener {
private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;
private MyView myView;
private boolean flag = true;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mWindowManager = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mLayoutParams = new WindowManager.LayoutParams();
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
mLayoutParams.format = PixelFormat.TRANSLUCENT;
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.x = 0;
mLayoutParams.y = 0;
mLayoutParams.height = 300;
mLayoutParams.width = 300;
myView = new MyView(this);
myView.setOnTouchListener(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (flag) {
flag = false;
mWindowManager.addView(myView, mLayoutParams);
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float x = motionEvent.getRawX();
float y = motionEvent.getRawY();
Log.d("x,y", "X" + x + " Y" + y);
return false;
}
解决方案
你不能。出于安全原因,当您不是前台应用程序时,Android 明确不允许您获取触摸事件。您正在尝试做的是明确反对操作系统想要的,如果您找到一种方法,Google 会尽快填补漏洞。做到这一点的唯一方法是在有根设备上,这意味着它不能在 play store 上工作(而做到这一点的方法是从 linux 设备层读取触摸数据)。
推荐阅读
- wordpress - 使用 Dokan 在 WooCommerce 上的税收课程
- sql-server - DataGrip 中的 SQL Server 2019 支持(无法连接到实例)
- kubernetes - 在 Kubernetes minikube 中运行的 ActiveMQ:如何配置管理员密码
- django - 基于 django 中一对多关系的字段连接过滤模型
- r - 过滤元素对,使每个元素只出现在一对中
- swift - IOS13状态栏背景颜色设置后不会变为透明
- kubernetes - 从 Kubernetes 集群中更新部署
- django - 查询属于用户的所有对象
- python - 使用 AutoDateLocator 的小刻度的不均匀网格
- sql-server - 计算两个日期之间的日期并将其修改为范围