使用AccessibilityService模擬點擊事件失敗的分析


使用AccessibilityService模擬點擊事件的方法:

AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);

但是前提是這個AccessibilityNodeInfo具有Onclick能力,也就是isClickable()為true。

問題在於控件的點擊效果不一定非得通過onClick方法實現,也可以通過onTouchEvent方法實現。當通過onTouchEvent方法實現的時候,就無法通過AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)方法模擬這個控件的點擊事件了。

一、點擊效果通過onClick方法實現

id_btn_openFloatWindow.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("onClick", "onClick");
            }
        });

二、點擊效果通過onTouchEvent方法實現

id_btn_openFloatWindow.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                onTouchEvent(event,v);
                return true;//改為true,則不會觸發OnClick方法
            }
        });

 

private boolean onTouchEvent(MotionEvent event, View view) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("onTouchEvent", "ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                
                break;
    
            case MotionEvent.ACTION_UP:
                Log.i("onTouchEvent", "ACTION_UP");
                break;
        }
        return true;
    }

如果采用OnTouchEvent方法實現點擊事件並且沒有做到和輔助功能兼容,那么也就無法通過onTouchEvent模擬該控件的點擊事件了。

===================================================================

onTouchEvent方法實現與輔助性服務保持兼容性的解決方案:

自定義視圖控件可能需要非標准的觸摸事件的行為。例如,一個自定義控件可以使用onTouchEvent(MotionEvent)來偵測ACTION_DOWN 和 ACTION_UP事件,觸發特殊的單擊事件。為了與輔助性服務保持兼容性,代碼處理該自定義點擊事件必須做到以下幾點:
  •     生成一個接近解釋AccessibilityEvent的點擊動作。
  •     對不能使用觸摸屏的用戶提供自定義點擊動作的輔助性服務。
 
    為了用一個有效的方法來處理這些需求,代碼應該重寫performClick()方法,該方法必須調用超類方法的實現,然后執行任何需要通過點擊事件完成的操作。當檢測到自定義點擊擊動作,代碼應該調用你的performClick()方法。下面的代碼示例演示了這種模式。
class CustomTouchView extends View {

    public CustomTouchView(Context context) {
        super(context);
    }

    boolean mDownTouch = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        // Listening for the down and up touch events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownTouch = true;
                return true;

            case MotionEvent.ACTION_UP:
                if (mDownTouch) {
                    mDownTouch = false;
                    performClick(); // Call this method to handle the response, and
                                    // thereby enable accessibility services to
                                    // perform this action for a user who cannot
                                    // click the touchscreen.
                    return true;
                }
        }
        return false; // Return false for other touch events
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any
        super.performClick();

        // Handle the action for the custom click here

        return true;
    }
}

上面所示的模式通過調用performClick()方法確保了自定義點擊事件是與輔助性服務兼容的,performClick()方法既生成一個輔助性事件,又提供一個訪問輔助性服務的入口,來代表用戶執行了自定義的點擊事件。

參考資料:

http://www.xuebuyuan.com/2061597.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM