Compartir tecnología

Icono de acceso directo de accesibilidad

2024-07-12

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

Antecedentes del problema

Los comentarios de las pruebas muestran que los atajos de accesibilidad no coinciden con los íconos de accesibilidad en la configuración.

Ventana flotante de acceso directo accesible

1. La ventana flotante está en systemui.
frameworksbasepackagesSystemUIsrccomandroidsystemuiaccessibilityfloatingmenuAccessibilityTargetAdapter.java
Cómo obtener el ícono:

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

frameworksbasepackagesSystemUIsrccomandroidsystemuiaccessibilityfloatingmenuMenuInfoRepository.java

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

2. Fuente de datos
frameworksbasecorejavacomandroidinternoaccesibilidaddiálogoAccessibilityTargetHelper.java

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

  • 1
  • 2

Los datos del icono AccessibilityTarget provienen de
frameworksbasecorejavacomandroidinternoaccesibilidaddiálogoAccesibilidadServicioObjetivo.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

Se puede ver que la imagen original que respalda el Servicio/actividad sin barreras se muestra directamente en systemui.

Menú de accesibilidad en configuración.

AjustessrccomandroidsettingsaccessibilityRestrictedPreferenceHelper.java

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

El método de adquisición en la configuración es el mismo que en systemUI. Todo a través del resolveInfo.loadIcon(mPm) del servicio.

la diferencia:
En la configuración, el Drawable se convierte en un AdaptiveIcon y luego se pasa a la preferencia. Así se muestran las esquinas redondeadas.

private RestrictedPreference createRestrictedPreference(){
	preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE));
}
  • 1
  • 2
  • 3
Cree una demostración para mostrarla en accesibilidad

Se registra a través de android.accessibilityservice.AccessibilityService y luego el sistema lo carga automáticamente.
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