Ich entwickle eine Anwendung, die TalkBack verwendet, um Menschen durch sie zu führen. In diesen Situationen möchte ich jedoch einige subtile Unterschiede im Layout der Anwendung haben, damit die Navigation einfacher ist, und auch zusätzliche Sprachausgaben (mit TextToSpeech), um den Benutzer zu führen.
Mein Problem ist, dass ich diese Änderungen und zusätzlichen Ausgaben nur möchte, wenn der Benutzer TalkBack aktiviert hat.
Gibt es eine Möglichkeit zu wissen, ob es so ist? Ich habe nichts Spezielles gefunden, um direkt auf die TalkBack-Einstellungen zuzugreifen, aber ich hatte gehofft, dass es eine Form des Zugriffs auf allgemeine Telefoneinstellungen gibt, die mir mitteilen könnte, was ich brauche.
Grüße und Danke im Voraus.
Der empfohlene Weg, dies zu tun, ist die Abfrage der AccessibilityManager für den aktivierten Zustand der Barrierefreiheitsdienste.
Wenn der TalkBack-Dienst ausgesetzt ist (mithilfe der Gestenverknüpfungen), ändert der AccessibilityManager seinen aktivierten Zustand nicht in disabled. Sehr sehr kleiner Randfall, nehme ich an, und technisch gesehen ist immer noch aktiviert, aber das hat mich heute gestolpert.
– ataulm
11. Januar 2015 um 21:39 Uhr
Wenn Sie den TalkBack-Dienst auf dem Nexus Player verwenden, tut dies isTouchExplorationEnabled() immer noch wahr?
– ataulm
21. September 2015 um 17:19 Uhr
Um meine eigene Frage zu beantworten, touch exploration ist auf Nexus Player verfügbar (zumindest auf Lollipop) und wird wahr zurückgegeben, wenn dies aktiviert ist.
– ataulm
13. Oktober 2015 um 10:58 Uhr
Weitere Details: Wenn Sie streng daran interessiert sind, ob TalkBack aktiviert ist, verwenden am.isTouchExplorationEnabled(). (Wenn Select to Speak aktiviert und TalkBack deaktiviert ist, am.isEnabled() wird immer noch true zurückgeben.)
– Jonik
24. Oktober 2017 um 10:53 Uhr
Perfekt! Vielen Dank für Ihre Zeit!
– Nik
25. Januar 2018 um 7:08 Uhr
ataulm
Novoda hat eine Bibliothek namens veröffentlicht Zugänglichkeitstools was macht diese Prüfung. Es fragt den Zugänglichkeitsmanager ab, um zu prüfen, ob Zugänglichkeitsdienste aktiviert sind, die das Flag “gesprochenes Feedback” unterstützen.
Beim Erkunden des Git-Hubs kann man viele gute Zeilen der Android-API sehen. Besonders die Erkennung, ob ein Voice-Over-Dienst mit 2 Codezeilen aktiviert ist, war meine Wahl. Ordentlich und nett.
– Nargar
24. Mai 2016 um 3:01 Uhr
Interessant, aber dieses Repo wurde vor 5 Tagen archiviert.
– rekire
15. Februar um 6:22 Uhr
Code aus dem Repo hinzugefügt. Es wurde archiviert, weil niemand mehr in der Nähe ist, um es zu pflegen, nehme ich an.
Zusammenfassend: Sie erkennen alle Screenreader mit Intents und fragen dann den Statusanbieter jedes einzelnen ab, um zu sehen, ob er aktiv ist.
Wenn Sie es wirklich nur auf TalkBack beschränken möchten, können Sie versuchen, das zu überprüfen ResolveInfo.serviceInfo.packageName für jedes Ergebnis, das von zurückgegeben wird queryIntentServices() um zu sehen, ob es mit dem TalkBack-Paket übereinstimmt.
Am Ende bin ich alle Dienste durchgegangen und habe nachgesehen, ob der TalkBack-Dienst aktiv war, aber Ihre Lösung ist viel besser, danke. Ich hatte allerdings ein Problem mit einem gecrackten ROM. Es wurden keine Dienste zurückgegeben.
– David Carvalho
28. Februar 2011 um 11:39 Uhr
Mike, ich habe das in Jelly Bean ausprobiert und es scheint nicht zu funktionieren … der Cursor scheint leer zu sein. Hast du eine Idee, wie man das in Jelly Bean macht? Ich habe eine neue Frage erstellt: stackoverflow.com/questions/11831666/…
– Pandre
6. August 2012 um 16:33 Uhr
Sie können eine Inline-Funktion in Kotlin wie folgt erstellen:
fun Context.isScreenReaderOn():Boolean{
val am = getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
if (am != null && am.isEnabled) {
val serviceInfoList =
am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN)
if (!serviceInfoList.isEmpty())
return true
}
return false}
Und dann können Sie es einfach anrufen, wann immer Sie es brauchen, wie:
if(context.isScreenReaderOn()){
...
}
Getestet und funktioniert vorerst gut.
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (am != null && am.isEnabled()) {
List<AccessibilityServiceInfo> serviceInfoList = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
if (!serviceInfoList.isEmpty())
return true;
}
return false;
David z
Für mich habe ich dieses Problem auf diese Weise gelöst, es funktioniert gut in meinem Projekt:
Verwenden Sie getEnabledAccessibilityServiceList(), um alle Accessibility-Dienste abzurufen. Ein Dienst, dessen Status offen ist, wird in dieser Liste aufgeführt
Talkback enthält eine Aktivität namens com.android.talkback.TalkBackPreferencesActivity. Sie können die Liste durchgehen, um herauszufinden, ob der Talkback-Dienst geöffnet ist
Der detaillierte Code unten:
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;
}
Jako
Dank @david-z answer (https://stackoverflow.com/a/41357058/2713403) habe ich diesen Ansatz gewählt, um zu wissen, ob die Android Accessibility Suite von Google aktiviert ist
/**
* This method checks if Google Talkback is enabled by using the [accessibilityManager]
*/
private fun isGoogleTalkbackActive(accessibilityManager : AccessibilityManager) : Boolean
{
val accessibilityServiceInfoList = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN)
for (accessibilityServiceInfo in accessibilityServiceInfoList)
{
if ("com.google.android.marvin.talkback".equals(accessibilityServiceInfo.resolveInfo.serviceInfo.processName))
{
return true
}
}
return false
}
Denken Sie daran, den Google-URI als konstant zu registrieren 🙂 und erhalten Sie die Accessibility Manager-Instanz, wie @caseyburkhardt sagt (https://stackoverflow.com/a/12362545/2713403). Der Unterschied zur @david-z-Antwort besteht darin, dass ich den Paketnamen der Android Accessibility Suite anstelle des App-Namens erhalten habe, da dies sicherer ist. Wenn Sie nach dieser Überprüfung überprüfen möchten, ob eine andere Barrierefreiheitssuite aktiviert ist (z. B. der Samsung Screen Reader), können Sie dies überprüfen if (accessibilityManager.isTouchExplorationEnabled)
Prost!
9960500cookie-checkWoher weiß ich, ob Android TalkBack aktiv ist?yes