Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 淺談輔助功能 AccessibilityService

淺談輔助功能 AccessibilityService

編輯:關於Android編程

輔助功能定義

對於那些由於視力、聽力或其它身體原因導致不能方便使用Android智能手機的用戶,Android提供了Accessibility功能和服務幫助這些用戶更加簡單地操作設備,包括文字轉語音(不支持中文)、觸覺反饋、手勢操作、軌跡球和手柄操作。開發者可以搭建自己的Accessibility服務,這可以加強可用性,例如聲音提示,物理反饋,和其他可選的操作模式。

隨著Android版本的不斷升級,AndroidAccessibility功能也越來越強大,Android 4.0版本以前,系統輔助服務功能比較單一,僅僅能過單向獲取窗口元素信息,比如獲取輸入框用戶輸入內容。到Android 4.1版本以後,系統輔助服務增加了與窗口元素的雙向交互,此時可以通過輔助功能服務操作窗口元素,比如點擊按鈕等。

現實輔助功能准備工作

1、新建自己的AccessibilityService類

想要讓自己程序實輔助功能,首先第一步就是要新建類並繼承AccessibilityService類。繼承自AccessibilityService的子類裡實現幾個重要的重載方法:

方法

描述

onAccessibilityEvent()

必須。通過這個函數可以接收系統發送來的AccessibilityEvent,接收來的AccessibilityEvent是經過過濾的,過濾是在配置工作時設置的。

onInterrupt()

必須。這個在系統想要中斷AccessibilityService返給的響應時會調用。在整個生命周期裡會被調用多次。

onServiceConnected()

可選。在系統成功連接上這個AccessibilityService會調用。在這個方法裡你可以做一下初始化工作。

onUnbind()

可選。在系統將要關閉這個AccessibilityService會被調用。在這個方法中進行一些釋放資源的工作。

2、新建AccessibilityService配置文件


 

屬性分別代表意義:

屬性

描述

description

就是設置裡輔助功能項的備注說明(不可在運行時修改)。

accessibilityEventTypes

設置響應事件的類型,typeAllMask當然就是響應所有類型的事件了。當然還有單擊、長按、滑動等(多個值由“|”分隔)(可在運行時修改)。

值有:

說明

typeViewClicked

Receives TYPE_VIEW_CLICKED events.

typeViewLongClicked

Receives TYPE_VIEW_LONG_CLICKED events.

typeViewSelected

Receives TYPE_VIEW_SELECTED events.

typeViewFocused

Receives TYPE_VIEW_FOCUSED events.

typeViewTextChanged

Receives TYPE_VIEW_TEXT_CHANGED events.

typeWindowStateChanged

Receives TYPE_WINDOW_STATE_CHANGED events.

typeNotificationStateChanged

Receives TYPE_NOTIFICATION_STATE_CHANGED events.

typeViewHoverEnter

Receives TYPE_VIEW_HOVER_ENTER events.

typeViewHoverExit

Receives TYPE_VIEW_HOVER_EXIT events.

typeTouchExplorationGestureStart

Receives TYPE_TOUCH_EXPLORATION_GESTURE_START events.

typeTouchExplorationGestureEnd

Receives TYPE_TOUCH_EXPLORATION_GESTURE_END events.

typeWindowContentChanged

Receives TYPE_WINDOW_CONTENT_CHANGED events.

typeViewScrolled

Receives TYPE_VIEW_SCROLLED events.

typeViewTextSelectionChanged

Receives TYPE_VIEW_TEXT_SELECTION_CHANGED events.

typeAnnouncement

Receives TYPE_ANNOUNCEMENT events.

typeViewAccessibilityFocused

Receives TYPE_VIEW_ACCESSIBILITY_FOCUSED events.

typeViewAccessibilityFocusCleared

Receives TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED events.

typeViewTextTraversedAtMovementGranularity

Receives TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITYevents.

typeGestureDetectionStart

Receives TYPE_GESTURE_DETECTION_START events.

typeGestureDetectionEnd

Receives TYPE_GESTURE_DETECTION_END events.

typeTouchInteractionStart

Receives TYPE_TOUCH_INTERACTION_START events.

typeTouchInteractionEnd

Receives TYPE_TOUCH_INTERACTION_END events.

typeWindowsChanged

Receives TYPE_WINDOWS_CHANGED events.

typeContextClicked

Receives TYPE_VIEW_CONTEXT_CLICKED events.

typeAssistReadingContext

Receives TYPE_ASSIST_READING_CONTEXT events.

typeAllMask

Receives TYPES_ALL_MASK i.e. all events.

 

accessibilityFeedbackType

設置回饋給用戶的方式,有語音播出和振動(多個值由“|”分隔)(可在運行時修改)。

值有:

說明

feedbackSpoken

Provides FEEDBACK_SPOKEN feedback.

feedbackHaptic

Provides FEEDBACK_HAPTIC feedback.

feedbackAudible

Provides FEEDBACK_AUDIBLE feedback.

feedbackVisual

Provides FEEDBACK_VISUAL feedback.

feedbackGeneric

Provides FEEDBACK_GENERIC feedback.

feedbackAllMask

Provides FEEDBACK_ALL_MASK feedback.

 

notificationTimeout

相同類型的兩個事件之間的最小時間發送到該服務(可在運行時修改)。

accessibilityFlags

可訪問性(多個值由“|”分隔)(可在運行時修改)。

值有:

說明

flagDefault

Has flag DEFAULT

flagIncludeNotImportantViews

Has flag FLAG_INCLUDE_NOT_IMPORTANT_VIEWS

flagRequestTouchExplorationMode

Has flag FLAG_REQUEST_TOUCH_EXPLORATION_MODE

flagRequestEnhancedWebAccessibility

Has flag FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY

flagReportViewIds

Has flag FLAG_REPORT_VIEW_IDS

flagRequestFilterKeyEvents

Has flag FLAG_REQUEST_FILTER_KEY_EVENTS

flagRetrieveInteractiveWindows

Has flag FLAG_RETRIEVE_INTERACTIVE_WINDOWS

 

packageNames

響應的程序的包名(多個值由“,”分隔)(可在運行時修改)。

canRetrieveWindowContent

是否能夠檢索活動窗口的內容(不可在運行時修改)。

settingsActivity

允許用戶修改此服務的設置的活動組件名稱,(如果不需要在運行時修改設置,可忽略該項)(不可在運行時修改)。

修改設置,可使用:android.accessibilityservice.AccessibilityService.setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo).

3、AndroidManifest裡注冊服務

 

 

 

 

 

AndroidManifest.XML文件添加以下配置

				// 系統權限
    
        
    
    	// XXXXX為上面新建的配置XML文件

獲取UI元素

在onAccessibilityEvent中,使用參數event的getSource方法獲取到的AccessibilityNodeInfo實例,即為觸發這次事件的UI節點。獲取到當前界面UITree的根節點可以使用findAccessibilityNodeInfosByText或者findAccessibilityNodeInfosByViewId方法。需要注意findAccessibilityNodeInfosByText在獲取UI元素時的判斷邏輯是包含而非等於。

示例代碼如:

 

Listnodes = event.getSource().findAccessibilityNodeInfosByText("立即安裝");
Listnodes = event.getSource().findAccessibilityNodeInfosByViewId("txt_1");

 

模擬用戶操作

模擬點擊

獲取界面上UI元素之後,可根據元素是否可響應操作進行相應的處理。例如,如果UI元素是一個有效的按鈕,則可以使用下面的代碼來進行模擬點擊:

nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);  

 

同理,如果UI元素是一個有效的列表,則可以使用下面的代碼進行模擬滑動:

nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); 

 

模擬物理鍵

也可以模擬物理鍵的操作,例如模擬按下返回鍵的代碼是:

AccessibilityService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);

 

模擬打開消息通知欄

在上面介紹accessibilityEventTypes中提到有一個事件: typeNotificationStateChanged,它便是消息通知欄狀態發生改變變觸發。一些紅包外掛工具裡頭,一有紅包就提醒的原理便是在onAccessibilityEvent中監聽該事件,然後判斷關鍵字並打開通知,示例關鍵代碼如:

 

if(event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED){
       return;
}
Listtexts = event.getText();
if(texts.size() <= 0 || !mAutoTrack) {
    return;
}
for(CharSequence text : texts) {
    String content = text.toString();
    if(!content.contains("[微信紅包]")){
        continue;
    }
    if(event.getParcelableData() == null || !(event.getParcelableData() instanceofNotification)) {
        continue;
    }
    Notification notification = (Notification)event.getParcelableData();
    PendingIntent pendingIntent =notification.contentIntent;
    try{
        pendingIntent.send();
    }catch (PendingIntent.CanceledException e) {
        e.printStackTrace();
    }
}

 

語音播放

首先,定義一個TextToSpeech對象,並在服務連上後進行初始化,示例代碼如:

 

private TextToSpeech mTts;
    ……
mTts = newTextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            mTts.setLanguage(Locale.US);
        }
    }
});

 

執行語音播放代碼:

mTts.speak("hello",TextToSpeech.QUEUE_FLUSH, null);

最後別忘記釋放資源:

mTts.shutdown();

 

建議:

在開發APP想支持語音播功能時,建議在用戶界面控件中,通過使用android:contentDescription屬性來描控件特性。

對於EditText控件,提供了一個android:hint屬性代替了contentDescription屬性

判斷是否開啟輔助功能

 

intaccessibilityEnabled =Settings.Secure.getInt(context.getApplicationContext().getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
if(accessibilityEnabled == 1) {
    String settingValue =Settings.Secure.getString(context.getApplicationContext().getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
}

 

如果手機中開啟了一些APP的輔助功能,settingValue的值為:APP1包名/APP1繼承AccessibilityService類全名: APP2包名/APP2繼承AccessibilityService類全名

使用Dump View Hierarchy for UI Automator解析UI界面視圖幫助查找節點對象

一、

\\

 

二、

\\

 

三、

\

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved