3

ビューを作成しTYPE_SYSTEM_ALERT、フラグFLAG_NOT_TOUCH_MODALとを設定して、。FLAG_WATCH_OUTSIDE_TOUCHを追加しましたWindowManager.addView()

ビューの外側で自分のアクティビティに触れると、すべてが機能しMotionEvent.getY()、正しい値が返されます。

ただし、アクティビティを終了して別のアプリケーションにタッチすると、MotionEvent.getY()常に0が返されます。

これが4.2でのみ発生するかどうかはわかりません。

どんな助けでもいただければ幸いです!

4

1 に答える 1

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

「外部タッチ」が、外部タッチをリッスンしているビューとUID(ここでそれについて読んでください)を共有しないビューに到達した場合、イベントディスパッチャはその座標を0,0に設定します。これはセキュリティの目的で確実に行われたものですが、軽減するように設計された脅威の全範囲を把握できるかどうかはわかりません。そして、この紳士(SO)は、2.3.6で位置データを取得できると報告していますが、少なくとも4.xではそれが明らかにならないようです(4.1.2を試しましたが、機能しませんでした)。

あなたがそれをフォローしたいのであれば、私はこれについてのバグチケットを開きました。少なくとも、ドキュメントにはこの情報を含める必要があります...このセキュリティ機能が本当に必要かどうかも知りたいです。

問題72746:FLAG_WATCH_OUTSIDE_TOUCHが4.2以降のACTION_OUTSIDEイベントの場所を返さない

于 2014-07-01T03:22:39.053 に答える