Android: How Do You Check If A Particular AccessibilityService Is Enabled


Answer :

I worked this one out myself in the end:

public boolean isAccessibilityEnabled() {     int accessibilityEnabled = 0;     final String LIGHTFLOW_ACCESSIBILITY_SERVICE = "com.example.test/com.example.text.ccessibilityService";     boolean accessibilityFound = false;     try {         accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);         Log.d(LOGTAG, "ACCESSIBILITY: " + accessibilityEnabled);     } catch (SettingNotFoundException e) {         Log.d(LOGTAG, "Error finding setting, default accessibility to not found: " + e.getMessage());     }      TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');      if (accessibilityEnabled==1) {         Log.d(LOGTAG, "***ACCESSIBILIY IS ENABLED***: ");          String settingValue = Settings.Secure.getString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);         Log.d(LOGTAG, "Setting: " + settingValue);         if (settingValue != null) {              TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;              splitter.setString(settingValue);              while (splitter.hasNext()) {                  String accessabilityService = splitter.next();                  Log.d(LOGTAG, "Setting: " + accessabilityService);                  if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVICE_NAME)){                      Log.d(LOGTAG, "We've found the correct setting - accessibility is switched on!");                      return true;                  }              }         }          Log.d(LOGTAG, "***END***");     }     else {         Log.d(LOGTAG, "***ACCESSIBILIY IS DISABLED***");     }     return accessibilityFound; } 

Since API Level 14, it is also possible to obtain the enabled accessibility services through the AccessibilityManager:

public static boolean isAccessibilityServiceEnabled(Context context, Class<? extends AccessibilityService> service) {     AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);     List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);      for (AccessibilityServiceInfo enabledService : enabledServices) {         ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;         if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(service.getName()))             return true;     }      return false; } 

Usage:

boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class); 

Checking if the service is enabled

/**  * Based on {@link com.android.settingslib.accessibility.AccessibilityUtils#getEnabledServicesFromSettings(Context,int)}  * @see <a href="https://github.com/android/platform_frameworks_base/blob/d48e0d44f6676de6fd54fd8a017332edd6a9f096/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java#L55">AccessibilityUtils</a>  */ public static boolean isAccessibilityServiceEnabled(Context context, Class<?> accessibilityService) {     ComponentName expectedComponentName = new ComponentName(context, accessibilityService);      String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(),  Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);     if (enabledServicesSetting == null)         return false;      TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');     colonSplitter.setString(enabledServicesSetting);      while (colonSplitter.hasNext()) {         String componentNameString = colonSplitter.next();         ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);          if (enabledService != null && enabledService.equals(expectedComponentName))             return true;     }      return false; } 

Usage:

boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class); 

Detecting when the service is enabled or disabled

Make a callback:

ContentObserver observer = new ContentObserver() {     @Override     public void onChange(boolean selfChange) {         super.onChange(selfChange);         boolean accessibilityServiceEnabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);         //Do something here     } }; 

Subscribe:

Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); context.getContentResolver().registerContentObserver(uri, false, observer); 

Unsubscribe when you're done:

context.getContentResolver().unregisterContentObserver(observer); 

Note that this doesn't work with the getEnabledAccessibilityServiceList() approach since its values are out-of-sync with the Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES values. That's why I think using Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES is a better one-size-fits-all approach.


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?