web-dev-qa-db-fra.com

Comment activer/désactiver par programmation le service d'accessibilité dans Android

Je voudrais activer/désactiver par programme les services d'accessibilité énumérés sous Options-> Option d'accessibilité.

Je pourrais commencer l'intention d'accessibilité comme ci-dessous:

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

Mais je n'ai aucune idée sur la façon d'activer les services listés dans la vue via mon code.

S'il vous plaît, donnez-moi votre avis.

23
Abilash

J'ai trouvé une solution qui fonctionnait pour moi en appelant

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

pkgname est le nom de votre package et classname le nom de classe de votre service d'accessibilité.

Si vous devez activer plusieurs services ou si vous ne souhaitez pas supprimer les paramètres précédents, vous pouvez utiliser : pour séparer d'autres services.

En outre, vous devrez peut-être exécuter l'application system et les autorisations suivantes.

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

Cependant, selon @Rupert Rawnsley cela pourrait ne pas fonctionner avec certaines versions d’Android, je travaille sur Android 4.0.4 et j’espère que cela fonctionnera pour vous.

PS. Si cela ne fonctionne pas, vous pourriez peut-être trouver de la chance dans /data/data/com.Android.providers.settings/databases/settings.db/secure, où Android stocke les paramètres sécurisés.

16
Kevin

Dans Android 7 (API 24), un service AccessibilityService peut se désactiver par programme en appelant la méthode disableSelf () .

7
Sam

À partir d'Android 6.0, vous pouvez utiliser:

adb Shell settings put secure enabled_accessibility_services packagname/servicename

Le fichier settings.db des anciennes versions n’est plus présent sur Android 6.0.

6
Zoli_K

AccessibilityService est spécial et ne peut pas être démarré par programme.

6
Rupert Rawnsley

Le mieux que vous puissiez faire est d’ouvrir manuellement les paramètres d’accessibilité avec:

Intention d'intention = nouvelle intention (Settings.ACTION_ACCESSIBILITY_SETTINGS)

et démarrez l'intention - vous pouvez également le faire à partir du fichier xml prefernece:

intention Android: action = "Android.settings.ACCESSIBILITY_SETTINGS"

4
Eran Katsav

Juste au cas où quelqu'un voudrait toujours désactiver talkback de adb lorsque vous êtes coincé dans votre écran de verrouillage, saisissez le mot de passe ou le code PIN. Une chose que vous pouvez essayer est adb Shell am force-stop com.google.Android.marvin.talkback

2
adb_user

Dans les tests instrumentés, je commence mon service d'accessibilité comme ceci:

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

J'ai testé sur Android 6 et 8. Cela fonctionne également pour les applications non-système.

1
Maxim Blumental