Technologieaustausch

Verknüpfungssymbol für Barrierefreiheit

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Problemhintergrund

Das Testfeedback zeigt, dass die Verknüpfungen zur Barrierefreiheit nicht mit den Barrierefreiheitssymbolen in den Einstellungen übereinstimmen.

Zugängliches schwebendes Fenster mit Verknüpfung

1. Das schwebende Fenster befindet sich in Systemui
FrameworksBasePackagesSystemUIsrccomAndroidSystemUIZugänglichkeitFloatingMenuAccessibilityTargetAdapter.java
So erhalten Sie das Symbol:

final AccessibilityTarget target = mTargets.get(position);
holder.mIconView.setBackground(target.getIcon());
  • 1
  • 2

FrameworksBasispaketeSystemUIsrccomAndroidSystemUIZugänglichkeitFloatingmenuMenuInfoRepository.java

void loadMenuTargetFeatures(OnInfoReady<List<AccessibilityTarget>> callback) {
    callback.onReady(getTargets(mContext, ACCESSIBILITY_BUTTON));
}
  • 1
  • 2
  • 3

2. Datenquelle
FrameworksBaseCoreJavaComAndroidInternalAccessibilityDialogAccessibilityTargetHelper.java

public static List<AccessibilityTarget> getTargets(Context context,@ShortcutType int shortcutType)

  • 1
  • 2

Die Daten des AccessibilityTarget-Symbols stammen von
FrameworksBaseCoreJavaComAndroidInternalAccessibilityDialogAccessibilityServiceTarget.java

AccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
        @AccessibilityFragmentType int fragmentType,
        @NonNull AccessibilityServiceInfo serviceInfo) {
    super(context,
            shortcutType,
            fragmentType,
            isShortcutContained(context, shortcutType,
                    serviceInfo.getComponentName().flattenToString()),
            serviceInfo.getComponentName().flattenToString(),
            serviceInfo.getResolveInfo().serviceInfo.applicationInfo.uid,
            serviceInfo.getResolveInfo().loadLabel(context.getPackageManager()),
            serviceInfo.getResolveInfo().loadIcon(context.getPackageManager()),
            convertToKey(convertToUserType(shortcutType)));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Es ist ersichtlich, dass das Originalbild, das barrierefreie Dienste/Aktivitäten unterstützt, direkt in systemui angezeigt wird.

Barrierefreiheitsmenü in der Einstellung

EinstellungensrccomandroidsettingsaccessibilityRestrictedPreferenceHelper.java

public List<RestrictedPreference> createAccessibilityServicePreferenceList(
 List<AccessibilityServiceInfo> installedServices) {
    Drawable icon = resolveInfo.loadIcon(mPm);
}
  • 1
  • 2
  • 3
  • 4

Die Erfassungsmethode in der Einstellung ist dieselbe wie in systemUI. Alle durch den Dienst discoverInfo.loadIcon(mPm);

der Unterschied:
In der Einstellung wird das Drawable in ein AdaptiveIcon umgewandelt und dann an die Einstellung übergeben. Es werden also abgerundete Ecken angezeigt.

private RestrictedPreference createRestrictedPreference(){
	preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE));
}
  • 1
  • 2
  • 3
Erstellen Sie eine Demo zur barrierefreien Anzeige

Es wird über android.accessibilityservice.AccessibilityService registriert und dann automatisch vom System geladen.
AndroidManifest.xml

        <service
            android:name=".MyAccessibilityService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action
                    android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibility_service_config" />
        </service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

res/xml/accessibility_service_config.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/setting_accessibility_tip"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:packageNames="com.whatsapp"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:notificationTimeout="100"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9