项目中遇到需要将客户的无障碍服务设置为默认开启,无障碍服务,是可以监听界面的操作,比如:点击、拖动、界面更新等信息的,更为强大的是可以获取屏幕信息,同时具备普通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;
}
这样就可以将自己的无障碍服务设置默认打开了~