Die Optimierung von Ablenkungen (Distraction Optimization, DO) dient dazu, die Interaktion des Fahrers mit der Einstellungen App zu reduzieren, während sich das Auto bewegt. Einige Einstellungen müssen möglicherweise während der Fahrt geändert werden. Daher wird die App nicht vollständig blockiert. Standardmäßig sind jedoch die meisten Einstellungen deaktiviert. Nur wichtige und leicht aktualisierbare Einstellungen sind aktiviert.
Abbildung 1. Aktivierte Apps während der Fahrt
Ganze Aktivitäten können auch blockiert werden, wenn sie nicht für die Konzentration optimiert sind, wie unten gezeigt. Diese Methode wird derzeit hauptsächlich für die Suche in den Einstellungen verwendet.
Abbildung 2. Alle Aktivitäten blockiert
Grundlegende Anpassungen der Leistung von Direct Outtake können über Konfigurations-Overlays vorgenommen werden. Wenn Sie eine detailliertere Anpassung benötigen, können Sie zusätzliche Änderungen über Code vornehmen.
Allgemeine Anpassungen
Wenn eine Einstellung während der Fahrt deaktiviert ist, wird durch Tippen darauf eine Toast-Mitteilung angezeigt, dass die Einstellung während der Fahrt nicht verfügbar ist, sofern die Einstellung mit einem Einstellungscontroller verknüpft ist. Für die Nachricht wird der String restricted_while_driving
verwendet, der mit einem Overlay angepasst werden kann, sofern der String kürzer als 60 Zeichen ist.
Abbildung 3. Benutzerdefiniertes Overlay
Das gesamte DO-Framework kann mit config_always_ignore_ux_restrictions
deaktiviert werden.
Wenn Sie diese Option auf „wahr“ setzen, kann der Fahrer mit allen Funktionen der Einstellungen-App interagieren.
<bool name="config_always_ignore_ux_restrictions">true</bool>
Wenn die obige Konfiguration auf „false“ festgelegt ist, greift die Einstellungen App auf
config_ignore_ux_restrictions
zurück, um zu ermitteln, welche Einstellungen während der Fahrt aktiviert werden sollen. Die hier angegebenen Strings müssen auf die in preference_keys.xml.
definierten Strings verweisen.
Verwendungsbeispiele
In diesem Beispiel wird gezeigt, wie Sie eine tief verschachtelte Einstellung während der Fahrt aktivieren. Damit dies funktioniert, müssen Sie config_ignore_ux_restrictions
alle Einstellungen in der Hierarchie hinzufügen.
Dazu gehören die System-, Sprach- und Eingabeeinstellungen sowie die TTS-Einstellungen in der Konfiguration, da unsere Hierarchie „System“ -> „Sprachen und Eingabe“ -> „Sprachausgabe“ lautet. Die Einstellungen im Text-to-Speech-Fragment sind jedoch weiterhin deaktiviert. Um sie zu aktivieren, müssen wir die Schlüssel für die Einstellungen hinzufügen, auf die wir zugreifen möchten. In diesem Beispiel möchten wir die Wiedergabeeinstellungen aktivieren, aber nicht die Engine-Einstellung. Daher fügen wir unserer Konfiguration pk_tts_playback_group
hinzu.
<string-array name="config_ignore_ux_restrictions"> [...] <item>@string/pk_system_settings_entry</item> <item>@string/pk_languages_and_input_settings</item> <item>@string/pk_tts_settings_entry</item> <item>@string/pk_tts_playback_group</item> </string-array>
Detaillierte Anpassung
Für einige Einstellungen ist möglicherweise ein individuelleres Verhalten erforderlich, als eine Einstellung einfach basierend auf dem Fahrstatus zu aktivieren oder zu deaktivieren. So wurden beispielsweise Bluetooth und WLAN bereits so geändert, dass gespeicherte Bluetooth-Geräte oder WLAN-Zugangspunkte während der Fahrt angezeigt werden.
Derzeit gibt es keine konfigurationsbasierte Lösung, um diese Art von Anpassungen vorzunehmen. Stattdessen können Sie eine benutzerdefinierte Klasse erstellen, die PreferenceController erweitert und onApplyUxRestrictions()
überschreibt, um die gewünschten Änderungen vorzunehmen.
Wenn Sie einen benutzerdefinierten Einstellungscontroller erstellen, können Sie die entsprechende XML-Datei überlagern, um den Standardeinstellungscontroller durch Ihre eigene Implementierung zu ersetzen.
Beispiele
In den Einstellungen für das Auto können einige Einstellungen so angepasst werden. Diese können als Beispiele für weitere Anpassungen verwendet werden. In der Liste der WLAN-Zugangspunkte soll beispielsweise nur während der Fahrt gespeicherte Zugangspunkte angezeigt werden, während der Rest ausgeblendet wird. Gehen Sie dazu so vor:
} else if (shouldApplyUxRestrictions(getUxRestrictions())) { wifiEntries = getCarWifiManager().getSavedWifiEntries(); } else { wifiEntries = getCarWifiManager().getAllWifiEntries(); }
Da die hier angezeigten Zugangspunkte bereits eingeschränkt sind, sollten Sie für diese Einstellungen keine zusätzlichen UxRestrictions
anwenden.
Überschreiben Sie daher onApplyUxRestrictions
und führen Sie eine absichtliche No-Op aus:
@Override protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) { // Since the list dynamically changes based on the UX restrictions, we // enable this fragment regardless of the restriction. Intentional no-op. }
Ein weiteres Beispiel finden Sie unter Bluetooth-gekoppelte Geräte.
Sie möchten weiterhin Bluetooth-Geräte verbinden und trennen können, aber den Zugriff auf zusätzliche Einstellungen für diese Geräte deaktivieren. Dazu überschreiben wir noch einmal onApplyUxRestrictions
. Wenn die Einschränkung NO_SETUP
jedoch aktiv ist, wird die sekundäre Aktion in den Einstellungen ausgeblendet.
@Override protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) { super.onApplyUxRestrictions(uxRestrictions); if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) { updateActionVisibility(getPreference(), /* isActionVisible= */ false); } }