2017-05-30 33 views
2

背景:這是什麼問題Android TalkBack:是否有監聽器來捕獲所有可訪問性事件?

我的應用程序有這個縮寫詞,讓我們假定它是

ABC

當我使用谷歌的語音服務也讀出這是很好的字母

但是,當我使用三星語音(S語音),它讀出它爲1個單詞,這不是很好!

那麼爲什麼不直接設置內容描述呢?

ABC出現在許多地方,設置替代內容描述是不可行的。此外,它可能會破壞其他聲音的內容描述了該讀出來正確般的服務谷歌的一個

我的計劃

所以我有一個問題了一段時間回來,我發現這個偉大的方法 的類時,擴展ViewGroup這是onRequestSendAccessibilityEvent。總之,這種方法可以讓你捕捉到AccessibilityEvent以某種方式修改它,然後再處理。除其他外,您可以抓取內容說明以進行讀取和修改。

我的想法是獲取當前使用的TTS或話語提示服務引擎,並使用正則表達式編輯字母ABC的內容描述,如果它是三星語音(S語音),則使其成爲A B C。希望!

我的問題

任何人都知道一個監聽器或回調以獲取AccessibilityEvent在全球或通用的情況下進行處理? onRequestSendAccessibilityEvent僅適用於ViewGroup。我找不到替代品Activity

任何人都知道如何捕捉所有傳入AccessibilityEvent或可能的替代解決我的問題

感謝您的閱讀!

回答

0

沒有無障礙事件/代表不適用於活動,他們也不需要。每個Activity應該有一個根/內容視圖,該視圖是ViewGroup的一個實例。這工作很適合我到活動中過濾所有可訪問性事件:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    View contentView = findViewById(android.R.id.content); 

    contentView.setAccessibilityDelegate(new View.AccessibilityDelegate(){ 
     @Override 
     public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) { 
      Log.wtf("Event: " + event.toString()); 
      return super.onRequestSendAccessibilityEvent(host, child, event); 
     } 

    }); 

} 

我還要指出,這話語提示支持字符導航的能力,這樣的解決方案,可以解決一個問題,即話語提示用戶不會看到問題。事實上在某些情況下,這可能會被視爲更糟。無論何時,如果您要更改殘疾人的內容,請仔細閱讀與實際內容相比較的內容。即使公佈是清潔:

"ABC" != "A B C" 

例如,在不同的情況下,一個人可能會認爲這種行爲爲「特徵」,如:

"NASA" 

一個天真的實現,這可能是剛剛「 toLowerCase「所有內容描述或在所有大寫字母之間添加空格。很顯然,這些解決方案都會產生不同類型的問題。

我的觀點是,如果屏幕上的內容令他們感到困惑,則話語提示用戶可以按字符進行導航。各種平臺上的AT用戶將習慣於他們平臺的「夸克」。通過使用上述解決方案之一,您已經迫使他們使用不同的夸克。有時候,最容易理解的解決方案就是讓"ABC" == "ABC",並允許AT用戶自己解決問題。

如果您不打算專門用「理想」方式修復所有字符串,那麼最好不要單獨放置。儘管如此,最好的情況是恰當地考慮這兩個問題,以及在場景中哪種解決方案最適用。

一些我喜歡用內容描述覆蓋的例子,可能會被正則表達式或字符串匹配捕獲。一個好的實現將會發現這些特定的場景,並通過REGEX - >字符串字典修復它們,將其替換爲文本或內容描述屬性,並將其設置爲新的內容描述。

"OFF" -> "off" //This one is super dumb on Google's part. "OFF" shows up on every switch in the OS! 
"ON" -> "on" //See above comment. 
"NASA" -> "nasa" 
etc. 

請注意,在我的字典中,我總是朝着這個詞前進,而不是朝着單個角色宣告:)。原因是,我沒有改變字符串的性質。或者更確切地說,在每一個insance符合下列條件:

oldString.equalsIgnoreCase(newString); 

現在添加本地化字符串代入公式和幸福......這是一個非常複雜的問題確實。也許只是把事情放在一邊是最好的選擇。