Android 4.2 ACTION_OUTSIDE MotionEvent X和Y在自己的应用程序之外返回0

kev*_*liu 3 android window touch

我创建了一个TYPE_SYSTEM_ALERT视图,设置标志FLAG_NOT_TOUCH_MODAL和FLAG_WATCH_OUTSIDE_TOUCH,并用WindowManager.addView()添加它;

当我在视图之外触摸我自己的活动时,一切正常,MotionEvent.getY()返回正确的值.

但是,如果我退出我的活动并触摸另一个应用程序,MotionEvent.getY()始终返回0.

我不确定这是否只发生在4.2上.

任何帮助,将不胜感激!

Hal*_*gen 9

不幸的是,这个问题在1.5年内一直没有得到答复,但我遇到了你做过的同样的事情,并找出了原因!

在搜索源代码后,我找到了问题的根源:

https://github.com/android/platform_frameworks_base/blob/79e0206ef3203a1842949242e58fa8f3c25eb129/services/input/InputDispatcher.cpp#L1417

// 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));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果"外部触摸"落在视图中,该视图不与正在侦听外部触摸的视图共享其UID(在此处阅读),则事件调度程序将其坐标设置为0,0.这绝对是出于安全目的而做的,但我不确定我是否看到了旨在减轻威胁的全部范围.这位先生(SO)报告你可以在2.3.6上检索位置数据,但似乎至少4.x不会向你透露它(我试过4.1.2,它没有用).

如果您想关注它,我会打开一张关于此的错误票.至少,文档需要包含这些信息......我还想知道这个安全功能是否真的有必要.

问题72746:FLAG_WATCH_OUTSIDE_TOUCH未返回4.2+上的ACTION_OUTSIDE事件的位置