Как узнать, активен ли Android TalkBack?

Я разрабатываю приложение, которое использует TalkBack, чтобы направлять людей через него. Однако в таких ситуациях я хочу иметь некоторые тонкие различия в макете приложения, так что навигация проще, а также дополнительные голосовые выходы (с TextToSpeech), чтобы помочь пользователю.

Моя проблема в том, что я хочу только эти изменения и дополнительные выходы, если у пользователя активна TalkBack.

Есть ли способ узнать, есть ли это? Я не нашел ничего конкретного для непосредственного доступа к настройкам TalkBack, но я надеялся, что есть какая-то форма доступа к общим настройкам телефона, которые могут дать мне знать, что мне нужно.

С уважением и благодарностью.

Solutions Collecting From Web of "Как узнать, активен ли Android TalkBack?"

Например, посмотрите на isScreenReaderActive() в файле HomeLauncher.java в приложении оболочки Eyes-Free (через потоки групп ).

Подводя итог: вы обнаруживаете все читатели экрана с помощью Intents, затем запрашиваете у поставщика статуса каждого, чтобы узнать, активен ли он.

Если вы действительно хотите ограничить его только TalkBack, вы можете попробовать проверить ResolveInfo.serviceInfo.packageName для каждого результата, полученного от queryIntentServices() чтобы узнать, соответствует ли он пакет TalkBack.

Рекомендуемый способ сделать это – запросить AccessibilityManager для разрешенного состояния служб доступности.

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

Novoda выпустила библиотеку под названием accessibilitools, которая выполняет эту проверку. Он запрашивает диспетчер доступности, чтобы проверить, включены ли какие-либо службы доступности, поддерживающие флаг «устной обратной связи».

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

Для меня я решил эту проблему таким образом, она хорошо работает в моем проекте:

  1. Используйте getEnabledAccessibilityServiceList (), чтобы получить все службы доступности, служба, статус которой открыт, будет в этом списке
  2. В Talkback есть активность с именем com.android.talkback.TalkBackPreferencesActivity, вы можете перемещаться по списку, чтобы узнать, открыт ли сервис talkback

Детальный код ниже:

  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; }