puedo - Android: cómo verifica si un servicio de accesibilidad en particular está habilitado
no puedo desactivar talkback samsung (8)
Verificando 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);
Detectando 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:
Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);
Darse de baja cuando haya terminado:
context.getContentResolver().unregisterContentObserver(observer);
Tenga en cuenta que esto no funciona con el enfoque getEnabledAccessibilityServiceList()
ya que sus valores no estaban sincronizados con los valores de Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
. Es por eso que creo que usar Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
es un mejor enfoque de talla única para todos.
Escribí una aplicación de Android que requiere el uso de AccessibilityService. Sé cómo verificar si Accessibility está habilitado o deshabilitado en el teléfono, pero no puedo encontrar la forma de determinar si mi aplicación se ha habilitado específicamente en el menú de accesibilidad.
Quiero avisar al usuario si AccessibilityService no se está ejecutando, pero no puedo encontrar una buena manera de hacerlo. ¿Hay algún método de API que me pueda faltar que me permita saber qué servicios de accesibilidad están habilitados en el dispositivo?
¿Puedes hacer un seguimiento de si el servicio funciona así? Si el servicio de accesibilidad está habilitado, ¿no debería estar ejecutándose también?
public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false;
@Override
public void onServiceConnected() {
isEnabled = true;
}
@Override
public void onDestroy(){
isEnabled = false;
}
Al final trabajé con esto:
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 la identificación de su y todos los servicios de accesibilidad instalados, puede ejecutar el siguiente fragmento de código:
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, la ID se parecía a org.your.package / .YourAccessibilityService.
Hasta ahora, el método funcionó confiable.
Obtenga la identificación cuando acaba de comenzar su servicio de actividad. 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
Luego puede usar el código de Martin (isAccessibilityEnabled) para verificar los servicios en ejecución.
Tal vez sea demasiado tarde, pero así es como compruebo el estado del Servicio de Accesibilidad:
$ adb shell dumpsys accessibility
Resultado:
ACCESSIBILITY MANAGER (dumpsys accessibility)
User state[attributes:{id=0, currentUser=true, accessibilityEnabled=false, touchExplorationEnabled=false, displayMagnificationEnabled=false}
services:{}]
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();
}
});
Se llamará a Listner cada vez que se cambie el estado, puede hacer un seguimiento del booleano para verificar el permiso, esta es la solución más simple y liviana para verificar el permiso.