Android 4.2 ACTION_OUTSIDE MotionEvent X和Y在自己的应用程序之外返回0
我创建了一个Android 4.2 ACTION_OUTSIDE MotionEvent X和Y在自己的应用程序之外返回0,android,window,touch,Android,Window,Touch,我创建了一个TYPE\u SYSTEM\u ALERT视图,设置标志FLAG\u NOT\u TOUCH\u MODAL和FLAG\u WATCH\u OUTSIDE\u TOUCH,并使用WindowManager.addView()添加了它 当我在视图外触摸我自己的活动时,一切都正常,并且MotionEvent.getY()返回正确的值 但是,如果我退出活动并触摸另一个应用程序,MotionEvent.getY()始终返回0 我不确定这是否只发生在4.2上 任何帮助都将不胜感激 不幸的是,这
TYPE\u SYSTEM\u ALERT
视图,设置标志FLAG\u NOT\u TOUCH\u MODAL
和FLAG\u WATCH\u OUTSIDE\u TOUCH
,并使用WindowManager.addView()添加了它
当我在视图外触摸我自己的活动时,一切都正常,并且MotionEvent.getY()
返回正确的值
但是,如果我退出活动并触摸另一个应用程序,MotionEvent.getY()
始终返回0
我不确定这是否只发生在4.2上
任何帮助都将不胜感激 不幸的是,这个问题已经有1.5年没有答案了,但我遇到了和你一样的事情,并找到了原因
在搜索源代码之后,我找到了问题的根源:
//检查监听外部触摸的窗口是否属于同一UID。如果是
//设置不向此窗口显示坐标信息的策略标志。
如果(屏蔽动作==动作事件动作停止){
sp ForewoldinoWhandle=
mTempTouchState.getFirstForeGroundIndowHandle();
const int32\u t foregroundowuid=foregroundowandle->getInfo()->ownerUid;
对于(size_t i=0;igetInfo()->ownerUid!=ForeGroundIndowUID){
mTempTouchState.addor updatewindow(inputWindowHandle,
InputTarget::FLAG_ZERO_COORDS,位集32(0));
}
}
}
}
如果“外部触摸”到达的视图与正在侦听外部触摸的视图不共享UID(),则事件调度器将其坐标设置为0,0。这肯定是出于安全目的,但我不确定我看到了它设计用来缓解的威胁的全部范围。这位先生报告说,您可以在2.3.6上检索位置数据,但似乎至少4.x不会向您显示它(我尝试了4.1.2,它不起作用)
如果你愿意的话,我打开了一张关于这个的错误通知单。至少,文档需要包含这些信息。。。我还想知道这个安全功能是否真的有必要
我没有找到。。。如果有人有一个虽然,请评论!(如果你想接收更新,也可以申请安卓错误通知单——最终可能有人会纠正这个问题。)与2018年一样
// Check whether windows listening for outside touches are owned by the same UID. If it is
// set the policy flag that we will not reveal coordinate information to this window.
if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
sp<InputWindowHandle> foregroundWindowHandle =
mTempTouchState.getFirstForegroundWindowHandle();
const int32_t foregroundWindowUid = foregroundWindowHandle->getInfo()->ownerUid;
for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
if (touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) {
sp<InputWindowHandle> inputWindowHandle = touchedWindow.windowHandle;
if (inputWindowHandle->getInfo()->ownerUid != foregroundWindowUid) {
mTempTouchState.addOrUpdateWindow(inputWindowHandle,
InputTarget::FLAG_ZERO_COORDS, BitSet32(0));
}
}
}
}