Κοινή χρήση τεχνολογίας

Εικονίδιο συντόμευσης προσβασιμότητας

2024-07-12

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

Φόντο προβλήματος

Τα σχόλια της δοκιμής δείχνουν ότι οι συντομεύσεις προσβασιμότητας δεν συνάδουν με τα εικονίδια προσβασιμότητας στις ρυθμίσεις.

Προσβάσιμο αιωρούμενο παράθυρο συντόμευσης

1. Το αιωρούμενο παράθυρο είναι σε systemui
FrameworksbasepackagesSystemUIsrccomandroidsystemuiaccessibilityfloatingmenuAccessibilityTargetAdapter.java
Πώς να αποκτήσετε το εικονίδιο:

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. Πηγή δεδομένων
FrameworksbasecorejavacomandroidinternalaccessibilitydialogAccessibilityTargetHelper.java

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

  • 1
  • 2

Τα δεδομένα του εικονιδίου AccessibilityTarget προέρχονται από
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

Μπορεί να φανεί ότι η αρχική εικόνα που υποστηρίζει Υπηρεσία/δραστηριότητα χωρίς εμπόδια εμφανίζεται απευθείας στο systemui.

Μενού προσβασιμότητας στη ρύθμιση

Settingsrccomandroid settingssaccessibilityRestrictedPreferenceHelper.java

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

Η μέθοδος απόκτησης στη ρύθμιση είναι η ίδια όπως στο systemUI. Όλα μέσω του solutionInfo.loadIcon(mPm) της υπηρεσίας.

η διαφορά:
Στη ρύθμιση, το Drawable μετατρέπεται σε AdaptiveIcon και στη συνέχεια περνά στην προτίμηση. Έτσι εμφανίζονται στρογγυλεμένες γωνίες.

private RestrictedPreference createRestrictedPreference(){
	preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE));
}
  • 1
  • 2
  • 3
Δημιουργήστε μια επίδειξη για εμφάνιση στην προσβασιμότητα

Εγγράφεται μέσω του android.accessibilityservice.AccessibilityService και στη συνέχεια φορτώνεται αυτόματα από το σύστημα.
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