为了帮视障人士“看见”,阿里工程师做了哪些努力?
阿里妹導讀:中國擁有約1300萬視障礙者,平均每100人就有1人每天生活在黑暗中。互聯網覆蓋方方面面的今天,借助智能設備,盲人獲得了獨立自主的機會:社交、網購、瀏覽新聞、聽音樂… 互聯網讓他們可以接觸到更多的事物,走出更遠的路。互聯網產品的無障礙體驗將直接影響到盲人群體的生活質量。因此建設信息無障礙環境,幫助他們更好融入社會,顯得尤為重要與迫切。
為了提供更好的信息無障礙體驗,繼釘釘iOS完成無障礙支持后,釘釘Android于2017年6月中旬啟動無障礙改造工作。經過與合作方“深圳市信息無障礙研究會”兩個多月的共同努力,不斷溝通,測試,改進,目前釘釘Android無障礙支持已經達到了較好的可用性。
下面我們一起來回顧釘釘Android無障礙支持的項目過程。
無障礙支持簡介
視覺存在障礙的用戶無法真切的看到手機設備的屏幕內容, 因此需借助讀屏軟件,主要依賴聽覺完成交互。目前Android設備多采用Talkback作為無障礙輔助服務。
Talkback是Android系統內置的無障礙服務,經過多個版本更新,目前有較好的體驗效果。它主要通過語音、震動和其他的語音反饋讓盲人用戶知道目前屏幕上是什么、正在觸摸什么、能夠做什么。
Talkback開啟后基本的操作方式:
1. 滾動:雙指滑動。
2. 點擊:選中view后在屏幕任意位置雙擊。
3:長按:選中view后,雙擊后按住。
4. 左滑右滑:前一項下一項
下面以已進行無障礙優化的釘釘為例,描述下無障礙支持要做的事情,清楚目的地才能夠知道怎么做。以下為部分聊天場景。
為能夠觀察到朗讀內容,上面示例打開了Talkback中開發者設置的“顯示語音輸出”選項。
我們要做的就是讓View獲得焦點后,讓讀屏軟件讀出最恰當的描述,讓盲人用戶清楚目前在什么位置, 能夠做什么。
無障礙事件分發
我們從源碼層次分析無障礙事件分發流程,幫助理解Android無障礙框架工作原理,以更好的進行無障礙支持:
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
在View.java中,我們可以看到很多類似上面sendAccessibilityEvent的方法調用。這里就是我們查看無障礙事件分發的起點。
最終調用繼承AccessibilityService的讀屏輔助APP的onAccessibilityEvent(AccessibilityEvent event)方法,完成無障礙提示。Talkback便是此類App,其onAccessibilityEvent 內對event進行內容解析并朗讀等音頻反饋。當然我們也可以繼承AccessibilityService開發自己的無障礙輔助APP。
上圖從方法調用順序展示無障礙事件分發流程。
無障礙工作清單
1. contentDescription標記用戶界面元素,最簡單也是最有效的
這是無障礙支持中最簡單的工作, 也是最主要的工作, 依賴其就能夠完成90%的無障礙支持工作。
TalkBack以View組件的四個屬性作為讀屏內容:contentDescription、組件類型(圖片、按鈕等),狀態(例如checkBox的選中狀態),后三者由Android框架自動支持,contentDescription屬性不會顯示在屏幕上,當用戶導航到這些控件時, 描述文本將會被讀出。對于ImageView,ImageButton,CheckBox,contentDescription是必須要添加的屬性。TextView,Button等含有text屬性的元素,可選擇不添加, Android框架將以其text屬性作為讀屏內容。contentDescription需保證簡潔明確,切忌冗長,較長的描述文本將影響盲人用戶的操作效率。
2. 啟動焦點導航,啟動視圖焦點和控制焦點順序
盲人用戶無法準確辯知當前界面可操作元素位置,相對與觸摸操作, 他們更多通過左右滑動獲取可操作元素焦點。因此無障礙中的另外一個主要工作是控制元素焦點。
當用戶界面元素的 android:focusable 屬性設置為 true 時,允許用戶使用定向控制聚焦元素并與之交互。 Android 框架提供的用戶界面控件默認可聚焦,同時Android 也提供了 API 讓開發者決定用戶界面控件是否可聚焦與請求給控件賦予焦點。無障礙支持中需保證每個操作做元素均是可聚焦的,同時對無障礙用戶存在干擾的元素應設置為不可獲取焦點。
焦點順序是以一種在某一特定方向上尋找相鄰元素的算法為基礎的。在某些情況下,默認的算法可能不匹配開發者定義的順序,或可能對于用戶不符合邏輯。在這些情況下,可以在布局文件中使用android:nextFocusxxx屬性明確地覆蓋焦點順序。
3. 自定義視圖
當Android框架提供的無障礙事件無法滿足我們的需求時, 例如,拖動一個進度條,我們希望把當前進度反饋給盲人用戶,此時便需要自定義視圖。通過上面對無障礙事件的分發過程的源碼分析,也可大致清楚自定義視圖在無障礙支持時可以做的幾個事情。此處不再深入展開,感興趣的讀者看參閱以下文檔的自定義視圖章節。
http://www.siaa.org.cn/androidguideline.pdf
sendAccessibilityEvent() // 適當時機發送無障礙事件
onInitializeAccessibilityEvent() // 初始化無障礙事件
dispatchPopulateAccessibilityEvent()// 對無障礙事件重寫
onInitializeAccessibilityNodeInfo() //該方法填充 AccessibilityNodeInfo對象,無障礙服務該對象獲得更多的上下文,為用戶提供合適的反饋。
4. 自定義無障礙服務
Android提供了標準的無障礙服務,包括Talkback,開發人員也可以創建和發布自己的無障礙服務。我們甚至可以利用無障礙服務代表用戶操作,完成諸多黑科技功能。我們以google提供的sample demo為例。
1)無障礙服務聲明,像其他Service服務一樣,需要在AndroidManifest.xml中聲明該服務。
2)無障礙服務參數配置,可以采用代碼動態設置,同時android4.0后可采用標簽完成。
accessibilityEventTypes // 指定監
聽的時間類型,例如點擊,窗口變化等
packageNames // 指定該無障礙
服務可以處理的應用包名, 多個應用可用“,
”分隔
canRetrieveWindowContent // 是否可以
獲取到窗口內容
3)無障礙服務方法,自定義無障礙服務需要繼承自AccessibilityService,并重寫該類onAccessibilityEvent, onInterrupt等方法。通過AccessibilityEvent可獲得View上下文等信息, 甚至可代表用戶操作。 “搶紅包插件”等多是基于無障礙服務。
4)對獲取到的AccessibilityEvent做音頻或者震動反饋, 提供無障礙服務
無障礙優化非一蹴而就的事情, 特別是對如釘釘此類功能較多的應用, 會有遺漏以及處理不當的地方,同時需防止增加contentDescription屬性時引進的NPE異常。因此無障礙優化過程中, 測試與回歸是必須的環節,也可以借助Espresso或Robolectric實現自動化測試。測試方法與測試內容參照:
https://developer.android.com/training/accessibility/testing.html
另外,我們也可以聯系專業的無障礙團隊, 幫助驗收測試, 釘釘無障礙優化過程中, 深圳無障礙信息研究會給予了巨大的幫助和支持,非常感謝。
PS:如果你希望了解盲人工程師的工作,可閱讀這篇歷史文章:
對著黑屏,背代碼編程,他的終極目標是讓自己失業
特殊情況和注意事項
條件允許的情況下, 使用Android內置的界面控件,這些控件默認提供了無障礙支持。釘釘存在部分以ImageView代替CheckBox的使用方式,該方式在UI上無區別,但是在無障礙交互方式下,盲人將無法正確獲知當前View的操作方式和選中狀態。不應直接采用ImageView完成CheckBox的功能。
EditView,因該使用hint代替contentDescription。文本框為空時,hint能提示盲人用戶輸入什么內容, 當文本框非空時,talkback將會讀出當前輸入文本的內容,而非hint。如設置了contentDescription,將會失去此體驗。
小控件組,如果控件比推薦的觸摸尺寸小,可以考慮使用ViewGroup將這些控件組合起來,并使用 android:contentDescription為該組合提供內容描述。以增大可點擊區域,減少無效焦點。
有功能改變的控件,如果用戶在正常使用應用的過程中,應用中的按鈕或其他控件的功能會發生改變(例如,一個按鈕從播放變為暫停),需對按鈕的 android:contentDescription 做出相應改變。
相關聯控件,提供獨立功能的一組控件,例如日期選擇器 (DatePicker),當用戶與相關聯控件中的個別控件交互的時候,提供有效的音頻反饋。
補充無障礙音頻反饋,例如,開發者想要把應用程序執行的操作告知用戶,如書籍自動翻頁功能,需使用announceForAccessibility(CharSequence)方法讓無障礙服務為用戶讀出該信息。
無障礙中contentDescription屬性是最簡單而有效的, 務須保證簡介準確。
在創建布局前,復查和遵守設計指南中提供的無障礙方案。https://material.io/guidelines/usability/accessibility.html#accessibility-principles
釘釘Android無障礙進展
為提供更好的信息無障礙體驗,讓視障用戶能夠盡可能的像正常用戶一樣使用釘釘,繼釘釘iOS完成無障礙支持,釘釘Android于2017年6月中旬啟動無障礙改造工作。經過與合作方“深圳市信息無障礙研究會”兩個多月的共同努力,不斷溝通,測試,改進,目前釘釘Android無障礙支持已經達到了較好的可用性。目前浙江盲人學校等組織已在使用。我們也建立了無障礙綠色通道,以第一時間收到用戶反饋的無障礙問題,并及時作出處理。
“在移動互聯網時代,我們已經很難想象離開網絡該如何生活,對于視障者來說,無障礙化程序能夠幫助他們打開一個全新的世界”。釘釘正在推進國際化,無障礙支持將幫助更多的國內外視障用戶,讓釘釘國際化版本呈現出更高的質量。
釘釘將持續推進無障礙工作,目前PC端的無障礙改造已在開發中,釘釘Android與釘釘iOS也在后續的迭代中將無障礙支持常態化,不斷優化無障礙體驗,帶給視障用戶更易用,更好用的上手體驗,讓釘釘幫助到越來越多的人… …
后記
無障礙優化是需要堅持做的事情,希望大家一起努力,幫助視障群體通過互聯網更好的融入社會。如果你有更好的無障礙優化方案,歡迎在留言區一起交流討論。
如果對釘釘團隊感興趣,也可以發送簡歷給我們:dujie.dj@alibaba-inc.com, 期待你的加入~
參考資料
http://www.siaa.org.cn/androidguideline.pdf
http://informationaccessibilityassociation.github.io/androidAccessibility/services.htm
http://www.jianshu.com/p/4cd8c109cdfb
https://github.com/appium/android-apidemos/blob/master/src/io/appium/android/apis/accessibility/ClockBackService.java
https://darkness463.github.io/2017/04/17/accessibility-event
http://informationaccessibilityassociation.github.io/androidAccessibility/checklist.htm
總結
以上是生活随笔為你收集整理的为了帮视障人士“看见”,阿里工程师做了哪些努力?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费下载!《九年双11:互联网技术超级工
- 下一篇: 阿里凑单算法首次公开!打包购商品挖掘系统