Condivisione della tecnologia

Icona di collegamento all'accessibilità

2024-07-12

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

Contesto del problema

Il feedback dei test mostra che le scorciatoie di accessibilità non sono coerenti con le icone di accessibilità nelle impostazioni.

Finestra mobile di collegamento accessibile

1. La finestra mobile è in systemui
frameworkbasepackagesSystemUIsrccomandroidsystemuiaccessibilitàfloatingmenuAccessibilityTargetAdapter.java
Come ottenere l'icona:

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

frameworkbasepackagesSystemUIsrccomandroidsystemuiaccessibilitàfloatingmenuMenuInfoRepository.java

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

2. Origine dati
frameworkbasecorejavacomandroidinternaaccessibilitàdialogoAccessibilityTargetHelper.java

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

  • 1
  • 2

Da cui provengono i dati dell'icona AccessibilityTarget
frameworkbasecorejavacomandroidinternaaccessibilitàdialogoAccessibilityServiceTarget.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

Si può vedere che l'immagine originale che supporta il servizio/attività senza barriere viene visualizzata direttamente nel systemui.

Menu di accessibilità nelle impostazioni

ImpostazionisrccomandroidimpostazioniaccessibilitàRestrictedPreferenceHelper.java

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

Il metodo di acquisizione nelle impostazioni è lo stesso di systemUI. Il tutto tramite il metodo ResolveInfo.loadIcon(mPm) del servizio;

la differenza:
Nell'impostazione, il Drawable viene convertito in un AdaptiveIcon e quindi passato alla preferenza. Vengono quindi visualizzati gli angoli arrotondati.

private RestrictedPreference createRestrictedPreference(){
	preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE));
}
  • 1
  • 2
  • 3
Crea una demo da visualizzare in Accessibilità

Viene registrato tramite android.accessibilityservice.AccessibilityService e quindi caricato automaticamente dal sistema.
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