這時代很多人都需要經常看顯示器,我也是其中一個。很不幸,我的眼睛並沒有超出常人的範圍,所以有些時候也會感到不舒服,無法再繼續看屏幕(但往往仍可以看其他東西)。然而由於種種原因(如跟人通信,自己腦子閒不下來),自己又無法較長時間離開電子設備。

我一直感覺看屏幕不舒服是因爲屏幕輻射的光過強,所以導致某種類似過載的結果。畢竟調暗屏幕亮度可以大幅降低不適。但從常識來說,太陽光的強度比屏幕高得多,然而在眼睛不舒服的時候看晴天的室外卻沒有看屏幕的相同感覺。可笑的是,我從來沒有找到任何實際解釋該現象的報導或文章,反而滿世界都是語焉不詳的「不眨眼」。我自己能給出的猜想只能是和偏振相關(比如屏幕光偏振不全或集中在某個角度),但自己沒有任何方法驗證。

類似地,其實我也覺得眼鏡戴起來總是比不戴着要有點略微的不舒服的。

於是我想起了讀屏器以及視障人士輔助軟件這類東西,簡單搜了搜,發現手機上還是只能用Android自帶的Talkback服務(也可能是谷歌框架的?):它的目的就是輔助視覺障礙人士使用手機,正好也符合我的需求。 經過基本的教程,我大概瞭解了其基本操作模式以及記住了自己比較在意的默認手勢。於是接下來就打算在其輔助下好好試驗一番,順便解放自己的雙眼。

然而,好玩的事情來了,我在這種狀況下仍然必須用的軟件中相當多居然都很難在這個模式下使用!

其中包括微信聊天、微信公衆號、ap15、trime……

原理

在繼續下去之前,有必要簡單解釋一下讀屏器的基本原理。因爲不瞭解原理的話,很容易就會認爲這是讀屏器的問題而不是那些軟件的問題——畢竟這種簡單原始的思路是很受大腦喜愛的。

Android的UI部分是用自己的一套庫,其中每個可顯示的部分都是一個View。每個View都有一個android:contentDescription屬性。該屬性就是爲視障人士設計的:讀屏器類的輔助工具會讀取這個值,然後讀出來。

於是流程很明確了:軟件在設置UI的可顯示部分之餘,對每個組件(比如一個按鈕)設置相應的android:contentDescription,以備無障礙服務使用。

當然實際使用中,無障礙服務應該還會分析層級關係,因爲最起碼要分析出「列表內」與否。

問題

在理解原理後,我遇到的問題就更令人迷惑了。

首先說ap15和trime:其中ap15是我用的launcher;trime是輸入法。隨便找張圖就明白,ap15這個launcher就是一堆文字,連圖標都不涉及,我實在是無法理解爲什麼在ap15上Talkback根本無法選取焦點。而trime也是類似的問題,無法選取虛擬按鍵。我個人推測,是這兩個app對ViewGroup進行了某種魔改或不合理使用,於是使得Talkback沒法正常分析其組件樹,無法深入到最底層。

Last-Launcher(開源ap15模仿品)大概樣子

有人模仿ap15而做的Last-Launcher。它就沒有ap15的這個問題。

微信的事情則是另一番狀況,且該狀況讓我對微信團隊的代碼質量表示十分懷疑——雖然我早就懷疑了。

先說微信聊天界面,畢竟這裏問題相對較小,而且無疑是微信的鍋。沒錯,Talkback可以正常深入到每個組件,切換前後也還算正常(但從邏輯上來說,應該先聚焦到是誰說的,再到內容)。然而手動點擊「對方」的頭像時,Talkback無法正常聚焦到那裏,而卻聚焦到整個屏幕;如果是羣聊,則前後變得混亂,完全沒法正常使用;打開「更多功能」部分,無法切換到第二頁,也沒有任何提示指示那裏還有個第二頁;表情部分也無法切換到後續頁面(當然,可以辯解,說看不見的情況下發表情沒有意義)。

如果說微信聊天界面的問題是小問題的話,公衆號文章則是大問題。其中問題分兩部分:一部分是微信的鍋,另一部分是作者的鍋。對於作者鍋這一部分,雖然微信不是這個問題的直接責任人,這卻顯示了微信限制的HTML沒有達到預期的作用;而且正是因爲微信做了種種限制,在某種意義上作者不得不鋌而走險選擇這種方案。

先說微信無論如何都甩不掉的問題:所有圖片都是通過JS加載,而圖片的「說明」是一串對人類沒有意義的字符;如果只是這樣就算了,大不了當個蒼蠅記住算了,但似乎大多數圖片都是同一個說明,然而又有個別圖片會是其他說明;在讓Talkback進行自動朗讀的時候,有些文章有時在讀到一半會自動返回頂部;同樣地,本來聚焦在文中某個部分,但「從下一項開始朗讀」時卻回到了頂部。評論部分則更奇妙:用戶頭像-用戶名-讚數這欄從右往左聚焦;讚數不提示這是讚數,而只有個數字;用戶頭像不叫「用戶頭像」而叫「96」。

公衆號文章中圖片讀起來就是類似這樣的一串: 640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1 。 我實在是無法理解爲什麼要弄這樣一個GET請求,而不是正常地不帶查詢地請求個圖片(帶alt屬性)。 當然,我同樣不理解爲什麼非得要用JS加載圖片。

另外,還有一個不是非常嚴重,但很影響的問題:文章的整個Layout的說明不是中文,導致遇到它時整個理解邏輯變得複雜。

而之所以說作者鍋那部分實際上還要怪微信,則是基於三個方面。

第一,微信用自己限制的HTML,但卻沒有對HTML進行檢測,從而讓生產出來的部分文章在一個<p><span></span></p>中擁有大量的段落,而另一部分文章每個換行都是一個<p></p>。而讀屏器類的軟件卻是要按結構進行地,結果就是第一種無法選中中間段落,第二種每讀幾個字就加個「區域」。微信號稱(騰訊)自己搞了個瀏覽器所以微信要用那個做內置瀏覽器,又自己專門限制HTML,但爲何在將HTML結構轉爲Android UI視圖結構時卻和處理無限制的網頁的chromium的表現一毛一樣?

第二,微信限制了可用的前端功能,導致作者實際上只能用各種奇怪的方案完成一些功能。但本來這些功能可能有現成(良好維護)的工具完成,結果微信的限制導致不能使用它們。而維護微信公衆號工具的又往往是一些封閉的人/機構(畢竟微信這個平臺就是這樣的東西),所以他們更不會去考慮這方面的事情,而且外部的人又不能參與改進(開源?那是啥)。

第三,微信公衆號發文章前要審覈。但審覈人員似乎完全沒有考慮過眼睛以外的東西。這點從許多公衆號中明明應該用文本表現的內容(比如次級標題、分節)卻以圖片表現就可見一斑。(更不要說那些幾乎全部是圖片但又明明不是漫畫的推文了。)

囈語

這次發現着實很有意思。因爲我在開發Easer的過程中有時會看到Android Studio提醒我某某圖片沒有加android:contentDescription,所以雖然簡單瞭解了一下其作用,但從來沒認真考慮過這點。

於是我打開了Easer試了試,發現居然一切還好。但同時,這也讓我對微信的惡感上升一層:我這樣什麼心都沒操地去寫,都不會影響;這微信團隊到底是搞了什麼么蛾子,導致Talkback在其上的表現是那個鬼樣子?

這件事讓我也感受到了視障人士(尤其是盲人)使用電子產品的障礙——尤其是在有這些(在某種意義上)「必不可少」但表現詭異的軟件的狀況下。我當時正是按盲人之類的做關鍵詞去搜索,但並沒有找到多少輔助軟件。而找到的那些都是電腦使用的(值得一提的是,有個似乎是國人開發的這類軟件有Linux版),似乎沒有誰在開發手機使用的軟件。

於是,Android/谷歌這邊畢竟還有個Talkback服務——雖然個別軟件對其不兼容,但整體還是能用。而且退一萬步來說,這是輔助服務的一部分,所以總是可以通過開發軟件來彌補的。而我看到的消息則說iOS上的(系統)讀屏器基本就是廢的,而且沒有辦法開發第三方軟件,實在是讓人百感交集。

總得來說,我看到了Android作爲操作系統,其爲增加人羣的兼容上所做出的努力,而且可以說這是目前技術條件下最好的方案了(直到基於CV+NLP的技術成熟)。但同時也看到了有些公司,總是在用奇奇怪怪的方法,最終做出奇奇怪怪的軟件,使得本來很容易可以達成的效果在其上變得一團糟。偏偏這些公司又是賺錢最多的一批,是最喜歡以用戶名義搞封閉的一批。不得不讓人覺得,這實在是充分體現了馬克思所作的總結。

Renyuneyun

Arch Linux用戶;閒暇時爲FLOSS做做貢獻;認同自由軟件理念。
自認唯物論者;反對任意形式的迷信。
觀察者;在意社會問題;拒絕先入爲主。

Renyuneyun

Join the discussion