it-swarm-es.tech

Cómo habilitar / deshabilitar mediante programación el servicio de accesibilidad en Android

Me gustaría habilitar/deshabilitar mediante programación los servicios de accesibilidad enumerados en la opción Configuración-> Accesibilidad.

Podría iniciar la intención de accesibilidad como a continuación:

Intent intent = new Intent(Android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent, 0);

Pero no tengo idea de cómo habilitar los servicios enumerados en la vista a través de mi código.

Por favor, dame tus puntos de vista.

25
Abilash

Encontré una solución que me funcionó llamando

Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "pkgname/classname");
Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ACCESSIBILITY_ENABLED, "1");

Donde pkgname es el nombre de su paquete y classname es el nombre de clase de su servicio de accesibilidad.

Si necesita habilitar varios servicios o no desea eliminar la configuración anterior, puede usar : para separar otros servicios.

También es posible que deba ejecutarse como una aplicación del sistema y puede que necesite los siguientes permisos

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />

Sin embargo, de acuerdo con @ Rupert Rawnsley esto podría no funcionar en algunas versiones de Android, estoy trabajando en Android 4.0.4 y espero que funcione para usted.

PD. Si no funciona, tal vez puedas encontrar algo de suerte en /data/data/com.Android.providers.settings/databases/settings.db/secure, ahí es donde Android almacena configuraciones seguras.

16
Kevin

En Android 7 (API 24), un AccessibilityService puede deshabilitarse mediante programación llamando al método disableSelf () .

8
Sam

Desde Android 6.0 puede usar:

adb Shell settings put secure enabled_accessibility_services packagname/servicename

La configuración.db de versiones anteriores ya no está presente en Android 6.0.

7
Zoli_K

Lo mejor que puede hacer es abrir manualmente la configuración de accesibilidad con:

Intención intención = nueva intención (Configuración.ACTION_ACCESSIBILITY_SETTINGS)

e inicie la intención: también puede hacerlo desde el archivo xml de prefernece:

intención Android: action = "Android.settings.ACCESSIBILITY_SETTINGS"

5
Eran Katsav

AccessibilityService es especial y no se puede iniciar mediante programación.

5
Rupert Rawnsley

En caso de que alguien todavía busque desactivar talkback desde adb cuando está atascado en la pantalla de bloqueo ingresando la contraseña o el pin. Una cosa que puedes probar es adb Shell am force-stop com.google.Android.marvin.talkback

3
adb_user

En las pruebas instrumentadas, inicio mi servicio de accesibilidad de esta manera:

private fun enableAccessibilityService() {
    val packageName = "com.example"
    val className = "$packageName.service.MyService"
    val string = "enabled_accessibility_services"
    val cmd = "settings put secure $string $packageName/$className"
    InstrumentationRegistry.getInstrumentation()
      .getUiAutomation(UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES)
      .executeShellCommand(cmd)
      .close()
    TimeUnit.SECONDS.sleep(3)
}

Probé en Android 6 y 8. Esto también funciona para aplicaciones que no son del sistema.

1
Maxim Blumental

Aquí está la solución de trabajo (si su actividad no se está ejecutando, se deshabilitará)

@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    Toast.makeText(this, "Connected!",Toast.LENGTH_SHORT).show();
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1);
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
        public void run() {
            serviceChecker();
        }
    }, 0, 5, TimeUnit.SECONDS);
}

private void serviceChecker(){
    if(!isActivityRunning(MainActivity.class)) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            disableSelf();
        }
    }
}
protected Boolean isActivityRunning(Class activityClass)
{
    ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (ActivityManager.RunningTaskInfo task : tasks) {
        if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
            return true;
    }

    return false;
}
0
BlackShaman