Android: ¿Cómo se comprueba si un determinado AccessibilityService está habilitado

He escrito una aplicación para Android que requiere el uso de AccessibilityService. Sé cómo comprobar si la accesibilidad está habilitada o deshabilitada en el teléfono, pero no puedo encontrar una forma de determinar si mi aplicación se ha habilitado específicamente en el menú de accesibilidad.

Estoy deseando pedir al usuario si AccessibilityService no está funcionando, pero no puede encontrar una buena manera de hacer esto. ¿Hay algún método de API que pueda estar faltando y que me permita saber qué servicios de accesibilidad están habilitados en el dispositivo?

Yo mismo he terminado esto al final:

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; } 

Desde API Nivel 14, también es posible obtener los servicios de accesibilidad en ejecución a través de AccessibilityManager:

 public static boolean isAccessibilityEnabled(Context context, String id) { AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> runningServices = am .getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK); for (AccessibilityServiceInfo service : runningServices) { if (id.equals(service.getId())) { return true; } } return false; } 

Para averiguar el ID de su y de todos los servicios de accesibilidad instalados, puede ejecutar el fragmento de código siguiente:

 public static void logInstalledAccessiblityServices(Context context) { AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> runningServices = am .getInstalledAccessibilityServiceList(); for (AccessibilityServiceInfo service : runningServices) { Log.i(TAG, service.getId()); } } 

En mi ejemplo, el ID parecía org.your.package / .YourAccessibilityService.

Hasta ahora, el método funcionó confiable.

¿Podrías hacer un seguimiento de si el servicio está funcionando así? Si el servicio de accesibilidad está habilitado, ¿no debería ejecutarse?

 public class MyAccessibilityService extends AccessibilityService{ public static boolean isEnabled = false; @Override public void onServiceConnected() { isEnabled = true; } @Override public void onDestroy(){ isEnabled = false; } 

Comprobación de si el servicio está habilitado

 /** * 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; } 

Uso:

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

Detectar cuando el servicio está habilitado o deshabilitado

Hacer una devolución de llamada:

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

Suscribir:

 context.getContentResolver().registerContentObserver(uri, false, observer); 

Anular la suscripción cuando haya terminado:

 context.getContentResolver().unregisterContentObserver(observer); 

Tenga en cuenta que esto no funciona con el getEnabledAccessibilityServiceList() ya que sus valores estaban fuera de sincronización con los valores Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES . Es por eso que creo que usar Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES es un enfoque mejor de un solo tamaño para todos.

Obtenga el ID cuando el servicio de actividad recién se haya iniciado. En su servicio de actividad OnSeriviceCeonnected después de todas las llamadas de inicialización. Utilizar esta…

 AccessibilityServiceInfo serviceInfo = this.getServiceInfo(); String accessibilityId = serviceInfo.getId(); 

Requiere Jelly Bean API

A continuación, puede utilizar el código de Martin (isAccessibilityEnabled) para comprobar los servicios en ejecución.

Esto necesita más veces

 AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); 
  AccessibilityManager accessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> runningservice = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK); accessibilityManager.addAccessibilityStateChangeListener(new AccessibilityManager.AccessibilityStateChangeListener() { @Override public void onAccessibilityStateChanged(boolean b) { Toast.makeText(MainActivity.this, "permission "+b, Toast.LENGTH_SHORT).show(); } }); 

Listner se llamará cada vez que se cambie el estado puede realizar un seguimiento de los booleanos para comprobar el permiso de esta es, con mucho, la solución más simple y más ligero para comprobar el permiso

  • ¿Cuál es la diferencia entre isDeviceLocked y isKeyguardSecure en el KeyguardManager de android?
  • Seleccionar la API de destino en la vista previa de diseño de diseño de Android Studio
  • Establecer el texto del portapapeles a través del shell del API a partir del nivel 11 del API
  • Fragmentos de Android en la API inferior
  • Implementar en Google Play Store a través de API
  • Cámara Android Api 2 Foco manual con toque
  • Hotspot multiplexado en Android
  • Cómo resaltar dinámicamente el LADO de un camino (o dibujar una línea al lado) con google maps o mapquest en Android
  • Android - Google Spreadsheet Api
  • Escribir una API de PHP y una aplicación para Android
  • API de WooCommerce para aplicaciones móviles
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.