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?
- ¿Hay disponible una API de Google Transit?
- "No se puede encontrar la base de datos de API; Comprobación de API no se realizó "en SDK de aplicaciones de Android con Eclipse
- Librería ligera de api de indexación de texto para Android
- ¿Cómo puedo acceder a mi APT REST local desde mi dispositivo Android?
- Inicialización del reproductor de YouTube en Fragmento
- Cómo leer la frecuencia de la CPU en el dispositivo Android
- ¿Qué es un token API?
- Abrir y editar archivos PDF en la aplicación de Android con API
- Utilizar PhoneNumberUtils.formatNumber () en la API 16
- "Error: Los tipos de cadenas no están permitidos (en 'configChanges' con el valor 'keyboard | keyboardHidden | orien" ... en AndroidManifest.xml
- Cómo instalar Android SDK más antiguo en Eclipse
- Arrastrar y soltar en el nivel 10 de la API en Android
- Error de compilación con API 10
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
- ¿La amistad de 'Android + FFMpeg' está realmente disponible?
- ¿Por qué JUnit 4 en Android no funciona?