如何使用好android的可訪問性服務(Accessibility Services)

原文:http://android.eoe.cn/topic/android_sdkhtml

* 主題*android

Manifest聲明和權限api

  • 可訪問性服務聲明服務器

  • 可訪問性服務配置app

AccessibilityService方法ide

得到事件細節ui

示例代碼spa

  • 主要的類*

AccessibilityServicexml

AccessibilityServiceInfohtm

AccessibilityEvent

AccessibilityRecord

AccessibilityNodeInfo

  • 同時要看*

Implementing Accessibility

一個可訪問性服務,是一個爲加強用戶界面並幫助殘疾用戶的應用程序,或者用戶可能沒法徹底與設備的交互。例如:用戶正在開車、照顧一個小孩或者參加一個很是吵鬧的聚會,那麼用戶就有可能須要添加額外的或者可替代的用戶反饋方式。

Android提供了標準的可訪問性服務,包括反饋,還有開發者可建立和發佈他們本身的服務。這個文檔解釋了創建一個可訪問性服務的基礎知識。

這種構建和部署可訪問性服務的技能被引入Android1.6(API級別4)而且在Android4.0(API等級14)中獲得顯著的改進。這個Android支持庫伴隨着Android4.0的發佈也更新到能夠提供支持之前Android1.6的加強可訪問性的特性。開發者的目標是普遍兼容可訪問性的服務被鼓勵使用在支持庫中和在Android4.0介紹更先進的可訪問特性的開發。

Manifest聲明和權限

提供可訪問性的應用程序,爲了被Android系統看成一個可訪問性服務,則必須在他們的應用程序manifests文件中包含特殊的聲明。這段解釋了所需和可選的可訪問性服務。

可訪問性服務聲明

爲了應用程序具備可訪問性服務,應用程序必須在其manifest文件中的service單元(而不是service單元中也必須包括一個可訪問性服務意圖的篩選程序,以下例所示:


<font

color="green">".MyAccessibilityService"
<font

color="green">"@string/accessibility_service_label">

<font

color="green">"android.accessibilityservice.AccessibilityService" />


在Android1.6(APL等級4)或者更高級中部署全部可訪問性的服務都須要這些聲明。

可訪問性服務配置(configuration)

可訪問性服務還必須提供一個,指定可以處理和添加額外信息服務的可訪問事件類型的配置。這個可訪問性服務的配置包含在AccessibilityServiceInfo類中。在運行的時候,你的服務能夠用這個類的接口和setServiceInfo())創建並設置一個配置。然而,用這種方法不是全部的配置選項是有用的。

從Android4.0開始,你能夠在你的,這樣才容許你設置全部你的可訪問性服務選項的完整範圍,以下例所示:

".MyAccessibilityService">
...
"android.accessibilityservice"
"@xml/accessibility_service_config" />

meta-data單元引用的一個XML文件,這個文件應該建立在應用程序的resource路徑(/res/xml/accessibility_service_config.xml)下面代碼
展現的是服務配置文件內容的示例:



可訪問性服務配置變量參數,最重要的一個功能是容許你指定你的服務程序能夠處理哪一種可訪問性事件類型。指定這信息可以使可訪問性服務相互合做,而且容許你做爲開發人員靈活的處理來自特定應用程序的特定事件類型。這個事件的篩選能夠含有下面的條件:
* 包的名稱(Package Name)-指定包名稱的應用程序,而且是須要你的服務程序處理可訪問性事件的應用程序。若是這個變量參數被省略掉了,你的可訪問性服務程序,服務任何應用程序的可訪問事件都會被認爲是可行的。這個變量參數,能夠在可訪問性服務配置文件裏以逗號分隔列表的android:packageNames屬性裏設置,或者用AccessibilityServiceInfo.packageNames的成員設置。
* 時間類型(Event Types)-須要你的服務程序處理指定的可訪問性事件的類型。這個參數能夠在可訪問性服務配置文件裏以逗號分隔列表的android:accessibilityEventTypes屬性裏設置,或者用AccessibilityServiceInfo.eventTypes的成員設置。

更多關於能夠被用在可訪問性服務配置文件的XML屬性信息,能夠根據下面這些連接,參考相關文檔。
android:description
android:packageNames
android:accessibilityEventTypes
android:accessibilityFlags
android:accessibilityFeedbackType
android:notificationTimeout
android:canRetrieveWindowContent
android:settingsActivity

更多的關於能夠在運行時動態地設置配置的設置信息,能夠參考AccessibilityServiceInfo文檔。

AccessibilityService 方法

一個提供可訪問性服務的應用程序必須繼承AccessibilityService類,而且重寫這個類的方法。這些方法是按從服務程序開始(onServiceConnected()))的時候這些方法(onAccessibilityEvent()), onInterrupt()))就一直運行到服務關掉(onUnbind()))的Android系統調用的順序呈現的。

  • onServiceConnected())--(可選的)當這個方法成功鏈接到你的可訪問性服務,系統將調用這個方法。用這個方法能夠一次性的設置你的服務,包括鏈接到用戶反饋系統服務,例如音頻的管理或者設備振動器。若是你想在運行的時候設置你的服務配置或者一次性的調整,這個是很方便定位哪一個服務系統調用setServiceInfo())。
  • onAccessibilityEvent())--(必須有)當這個方法檢測到一個與你可訪問性服務指定的事件過濾參數相匹配的可訪問性事件(AccessibilityEvent)系統將調用這個方法迴應。例如:在一個應用程序中,當用戶點擊按鈕或者一個用戶界面啓動,你的哪一個可訪問性服務將提供反饋。當這種狀況發生,系統將調用與AccessibilityEvent相關的服務方法,這樣你才能夠作出響應(interpret)並給用戶提供反饋。在你的服務生命週期期間,這個方法能夠被屢次調用。
  • onInterrupt())--(必須有)當系統想中斷你的服務系統提供的反饋,這個方法就會被調用。一般是對用戶採起行動作出響應,例如:移動焦點到一個不一樣的用戶控制界面而不是你當前提供反饋的那個界面。在你的服務生命週期期間,這個方法能夠被屢次調用。
  • onUnbind())--(可選的)當系統想關閉這個可訪問性服務,這個方法就會被調用。用這個方法能夠一次性的關閉程序 ,包括取消使用者的反饋系統服務的分配,例如:音頻管理或者設備振動器。 這些回調的方法提供了你的可訪問性服務的基本構架。由你決定怎樣處理Android系統以AccessibilityEvent對象形式提供的數據和怎樣提供給用戶反饋。

得到事件的詳細信息

Android系統經過AccessibilityEvent對象把關於用戶界面交互的信息提供給可訪問性服務。在Android4.0以前,這些有用的信息在可訪問性事件中,但另外一方面提供了大量有用的有關用戶可選的用戶界面控件的詳細信息,典型的是提供了有限的上下關聯信息。在許多狀況下,這些缺失的先後關聯的信息,對理解這些可選管理控件的含義有多是很重要的。
在一個界面中,上下關聯是相當重要的一個典型的例子是日曆或日程計劃。若是一個用戶選擇了週一到週五的「下午4點」時間列表,而且可訪問性服務將通知「下午4點」,可是沒有明確這是某個月的哪一個週五和週一,很難將理想的信息反饋給用戶。在這種狀況下,對於想安排一次會議的人,這個用戶界面控制的上下關聯是相當重要的。

Android4.0顯著地拓展了一個可訪問性服務能得到有關經過基於視圖底層的可訪問性服務的用戶界面交互的大量信息。視圖分層結構可由包含組件(它的父類)的用戶界面組件和可被組件(它的子類)包含的用戶界面元素組成。用這個方式,Android系統能夠提供更多有關容許可訪問性服務提供更多有用的反饋給用戶的可訪問性事件的詳細信息。

一個可訪問性服務獲取有關一個用戶接口事件利用AccessibilityEvent事件經過系統向服務器請求返回一個onAccessibilityEvent())回調方法的信息 。這個可訪問性服務對象提供了關於事件的詳細細節。包括這個類型的對象做用,其描述文本和其餘細節。從Android4.0(而且在支持庫中支持之前版本的accessibilityeventcompat對象)開始,你能夠得到關於事件用這些調用的額外信息:
AccessibilityEvent.getRecordCount())和getRecord(int))--這些方法容許你檢索AccessibilityRecord對象集,這有助於AccessibilityEvent經過系統傳遞給你,這樣才能夠提供更多的有關可訪問性服務的上下文。
AccessibilityEvent.getSource())--這方法返回一個AccessibilityNodeInfo對象。這些對象容許你索取來自可訪問性事件的父類和子類組件和追查他們的內容和狀態以便提供

重點:從AccessibilityEvent調查這個完整視圖層次的能力可能曝光你的可訪問性服務的私人用戶信息。因爲這個緣由,你的服務必須請求這種可經過可訪問性服務配置XMLservice configuration XML文件的訪問級別,包括true。若是在你的服務配置xml文件中不包括此設置,將不能成功調用getSource())。

API演示項目包含兩個例子,這兩個例子能夠做爲生成可訪問性服務的起點。(/samples//ApiDemos/src/com/example/android/apis/accessibility):* AccessibilityService的實現和能夠被用來做爲發展基礎的可訪問性服務的基礎,兼容安卓1.6(API級別4)和更高的。* Support Libary) 中等效的支持包類來代替在最新的API級別中介紹的類 (例如,AccessibilityNodeInfo)。用等效的支持包類(例如, AccessibilityNodeInfoCompat)可以使這個示例處理API版本兼容Android1.6(API級別4)。

相關文章
相關標籤/搜索