기술나눔

접근성 바로가기 아이콘

2024-07-12

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

문제 배경

테스트 피드백에 따르면 접근성 단축키가 설정의 접근성 아이콘과 일치하지 않는 것으로 나타났습니다.

접근 가능한 바로가기 부동 창

1. 부동 창은 systemui에 있습니다.
프레임워크베이스패키지시스템UIsrccom안드로이드시스템UI접근성플로팅메뉴접근성대상Adapter.java
아이콘을 얻는 방법:

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

프레임워크베이스패키지시스템UIsrccom안드로이드시스템UI접근성플로팅메뉴메뉴정보Repository.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

접근성대상 아이콘 데이터의 출처는 다음과 같습니다.
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에 바로 표시되는 것을 확인할 수 있습니다.

설정의 접근성 메뉴

설정srccomandroid설정접근성제한된환경설정Helper.java

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

설정의 획득 방법은 systemUI와 동일합니다. 모두 서비스의solveInfo.loadIcon(mPm)을 통해 이루어집니다.

차이점:
설정에서 Drawable은 AdaptiveIcon으로 변환된 다음 기본 설정으로 전달됩니다. 따라서 둥근 모서리가 표시됩니다.

private RestrictedPreference createRestrictedPreference(){
	preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE));
}
  • 1
  • 2
  • 3
접근성에 표시할 데모 만들기

android.accessibilityservice.AccessibilityService를 통해 등록된 후 시스템에 의해 자동으로 로드됩니다.
안드로이드매니페스트.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/접근성_서비스_구성.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