Woher weiß ich, ob Android TalkBack aktiv ist?

Lesezeit: 5 Minuten

Woher weis ich ob Android TalkBack aktiv ist
David Carvalho

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.

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

  • 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

1647148386 916 Woher weis ich ob Android TalkBack aktiv ist
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.

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

public boolean isSpokenFeedbackEnabled() {
    List<AccessibilityServiceInfo> enabledServices = getEnabledServicesFor(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
    return !enabledServices.isEmpty();
}

private List<AccessibilityServiceInfo> getEnabledServicesFor(int feedbackTypeFlags) {
    return accessibilityManager.getEnabledAccessibilityServiceList(feedbackTypeFlags);
}

  • 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.

    – ataulm

    22. Februar um 20:26 Uhr

Als Beispiel siehe isScreenReaderActive() in HomeLauncher.java-Datei in der Eyes-Free-Shell-Anwendung (über Gruppen-Thread).

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;

1647148387 441 Woher weis ich ob Android TalkBack aktiv ist
David z

Für mich habe ich dieses Problem auf diese Weise gelöst, es funktioniert gut in meinem Projekt:

  1. Verwenden Sie getEnabledAccessibilityServiceList(), um alle Accessibility-Dienste abzurufen. Ein Dienst, dessen Status offen ist, wird in dieser Liste aufgeführt
  2. 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;
}

Woher weis ich ob Android TalkBack aktiv ist
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!

996050cookie-checkWoher weiß ich, ob Android TalkBack aktiv ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy