2011-02-25 213 views
23

我正在開發一個使用TalkBack指導人們通過它的應用程序。但是,在這些情況下,我希望在應用程序的佈局上有一些不同尋常的差異,因此導航更容易,並且還具有額外的語音輸出(使用TextToSpeech)來幫助指導用戶。如何知道Android TalkBack是否處於活動狀態?

我的問題是,我只想要這些更改和額外的輸出,如果用戶有話語提示活躍。

有什麼方法可以知道它是否是?我沒有找到任何具體的直接訪問話語提示設置,但我希望有某種形式的訪問一般的手機設置,可以讓我知道我需要什麼。

感謝您的提前。

回答

2

例如,請參閱isScreenReaderActive()中的HomeLauncher.java file in the Eyes-Free shell application(通過groups thread)。

綜上所述:您可以使用Intents檢測所有屏幕閱讀器,然後查詢每個屏幕閱讀器的狀態提供程序以查看它是否處於活動狀態。

如果您確實想將其限制爲僅限話語提示,則可以嘗試檢查ResolveInfo.serviceInfo.packageName以獲得從queryIntentServices()返回的每個結果,以查看它是否與TalkBack包相匹配。

+0

最後我經歷的所有服務,看看話語提示一個是活躍的,但您的解決方案好多了,謝謝。不過,我確實遇到了破解ROM的問題。沒有服務正在退回。 – 2011-02-28 11:39:13

+0

邁克,我已經在Jelly Bean中嘗試了這一點,它似乎沒有工作......光標似乎是空的。你有什麼想法如何在果凍豆做到這一點?我創建了一個新問題:http://stackoverflow.com/questions/11831666/how-to-check-if-talkback-is-active-in-jellybean – pandre 2012-08-06 16:33:54

47

這樣做的推薦方法是查詢AccessibilityManager以獲取無障礙服務的啓用狀態。

AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE); 
boolean isAccessibilityEnabled = am.isEnabled(); 
boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled(); 
+8

如果TalkBack服務暫停(使用手勢快捷鍵),則AccessibilityManager不會將其啓用狀態更改爲「禁用」。我想,非常非常小的邊緣情況下,技術上它仍然是可用的,但今天讓我絆倒了。 – ataulm 2015-01-11 21:39:48

+0

如果您在Nexus Player上使用TalkBack服務,「isTouchExplorationEnabled()」是否仍然返回true? – ataulm 2015-09-21 17:19:41

+2

爲了回答我自己的問題,我們可以在Nexus Player上(至少在棒棒糖上)使用「touch exploration」,如果選中此項,它將返回true。 – ataulm 2015-10-13 10:58:51

3

Novoda已經發布了一個名爲accessibilitools的庫,它進行這項檢查。它查詢可訪問性管理器以檢查是否有任何支持「語音反饋」標誌的可訪問性服務。

AccessibilityServices services = AccessibilityServices.newInstance(context); 
services.isSpokenFeedbackEnabled(); 
+1

探索git集線器可以看到很多Android API的優點。特別檢測是否使用2行代碼啓用了語音覆蓋服務是我的選擇。整潔而美好。 – 2016-05-24 03:01:36

0

對於我來說,我用這種方式解決了這個問題,它運作良好,在我的項目:

  1. 使用getEnabledAccessibilityServiceList()來獲取所有可訪問服務,其狀態是打開的將是一個服務這個名單
  2. 對講包含一個名爲com.android.talkback.TalkBackPreferencesActivity活動,您可以遍歷列表中找到對講服務是否打開

下面的詳細代碼:

private static final String TALKBACK_SETTING_ACTIVITY_NAME = "com.android.talkback.TalkBackPreferencesActivity"; 

    public static boolean accessibilityEnable(Context context) { 
     boolean enable = false; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      try { 
       AccessibilityManager manager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); 
       List<AccessibilityServiceInfo> serviceList = manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN); 
       for (AccessibilityServiceInfo serviceInfo : serviceList) { 
        String name = serviceInfo.getSettingsActivityName(); 
        if (!TextUtils.isEmpty(name) && name.equals(TALKBACK_SETTING_ACTIVITY_NAME)) { 
         enable = true; 
        } 
       } 
      } catch (Exception e) { 
       if (Logging.isDebugLogging()) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return enable; 
} 
+0

他們可以在將來的更新中更改設置活動的名稱。 – ataulm 2017-01-15 20:34:32

0

打開系統設置並進入可及性和挖掘,以關再說回來選項

+0

我認爲OP是以程序方式詢問「TalkBack」是否處於活動狀態。 – adiga 2017-11-05 08:51:47

+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17842918) – clemens 2017-11-05 10:56:01

相關問題