Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 4.2 ACTION_OUTSIDE MotionEvent X和Y在自己的应用程序之外返回0_Android_Window_Touch - Fatal编程技术网

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));
            }
        }
    }
}