Android 无障碍服务设置

项目中遇到需要将客户的无障碍服务设置为默认开启,无障碍服务,是可以监听界面的操作,比如:点击、拖动、界面更新等信息的,更为强大的是可以获取屏幕信息,同时具备普通Service的能力。

具体如何设置呢?代码如下:

        try{
        Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(context);    //这个是获取所有可用的无障碍service列表

        if (enabledServices == (Set<?>) Collections.emptySet()) {    //如果获取的service集合为空,新创建一个集合
            enabledServices = new HashSet<ComponentName>();
        }

        ComponentName toggledService = ComponentName.unflattenFromString("com.vc/.service.DetectionService");//添加自己服务的包名和类名
        enabledServices.add(toggledService);    //将需要设置的服务降到集合里
        // Enabling at least one service enables accessibility.

        StringBuilder enabledServicesBuilder = new StringBuilder();    

        for (ComponentName enabledService : enabledServices) {
            enabledServicesBuilder.append(enabledService.flattenToString());    //将所有的服务变成字符串,串到一起
            enabledServicesBuilder.append(
                    AccessibilitySettings.ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);    //每次添加一个服务的时候后面加上分隔符.
        }
        final int enabledServicesBuilderLength = enabledServicesBuilder.length();
        if (enabledServicesBuilderLength > 0) {
            enabledServicesBuilder.deleteCharAt(enabledServicesBuilderLength - 1);    //添加最后一个服务肯定会多出一个分隔符,这里删掉多余的分隔符
        }
        android.provider.Settings.Secure.putString(context.getContentResolver(),
                android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                enabledServicesBuilder.toString());    //将服务的字符串重新存储

        // Update accessibility enabled.
        android.provider.Settings.Secure.putInt(context.getContentResolver(),
                android.provider.Settings.Secure.ACCESSIBILITY_ENABLED, 1);    
        }catch(Exception e){}

上面的代码中获取所有无障碍service方法getEnabledServicesFromSettings是由AccessibilityUtils类来处理的,AccessibilityUtils这个类Android6.0的路径是在packages/apps/Settings/src/com/android/settings/accessibility/AccessibilityUtils.java,Android 7.0之后被放到了frameworks/base/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java这里,

           /**
     * @return the set of enabled accessibility services. If there are no services,
     * it returns the unmodifiable {@link Collections#emptySet()}.
     */
    public static Set<ComponentName> getEnabledServicesFromSettings(Context context) {
        return getEnabledServicesFromSettings(context, UserHandle.myUserId());
    }
    /**
     * @return the set of enabled accessibility services for {@param userId}. If there are no
     * services, it returns the unmodifiable {@link Collections#emptySet()}.
     */
    public static Set<ComponentName> getEnabledServicesFromSettings(Context context, int userId) {
        final String enabledServicesSetting = Settings.Secure.getStringForUser(
                context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                userId);
        if (enabledServicesSetting == null) {
            return Collections.emptySet();
        }

        final Set<ComponentName> enabledServices = new HashSet<>();
        final TextUtils.SimpleStringSplitter colonSplitter = sStringColonSplitter;
        colonSplitter.setString(enabledServicesSetting);

        while (colonSplitter.hasNext()) {
            final String componentNameString = colonSplitter.next();
            final ComponentName enabledService = ComponentName.unflattenFromString(
                    componentNameString);
            if (enabledService != null) {
                enabledServices.add(enabledService);
            }
        }

        return enabledServices;
    }

这样就可以将自己的无障碍服务设置默认打开了~

猜你喜欢

转载自blog.csdn.net/lancelots/article/details/84066745