2016-07-13 2 views
9

Comment activer/désactiver par programme un service de lecteur d'écran Android tel que TalkBack?Activation/désactivation par programme des paramètres d'accessibilité sur le périphérique Android

Je développe une application de type kiosque qui sera installée sur un appareil Android qui sera prêté aux visiteurs pendant qu'ils visitent un musée particulier. (Nous sommes encore en train de déterminer quel appareil nous allons utiliser.) Le plan est de permettre uniquement aux utilisateurs d'utiliser notre application et ne pas avoir accès à l'application de paramètres android. Cependant, nous aimerions autoriser les utilisateurs à configurer certains paramètres d'accessibilité. Quand ils ont fini avec l'appareil, nous devons restaurer tous les paramètres à nos valeurs par défaut.

La discussion sur le lien ci-dessous suggère de lancer l'application Paramètres d'Android. Mais nous ne voulons pas que les utilisateurs accèdent à beaucoup d'autres paramètres.

How to Programmatically Enable/Disable Accessibility Service in Android

+0

Est-ce que votre application va être signé une application système? –

+0

Ça pourrait l'être. Est-ce nécessaire pour que cela fonctionne? – John

+0

Cochez cette autre publication sur StackOverflow, [cliquez ici] (http: // stackoverflow.com/questions/10061154/comment-programmer-activer-désactiver-accessibilité-service-dans-android) – Ethan

Répondre

6

Seules les applications système peuvent activer/désactiver le service d'accessibilité programatically. Les applications système peuvent écrire directement dans les paramètres secure db pour démarrer le service d'accessibilité.

Settings.Secure.putString(getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.packagename/com.packagename.componentname"); 

Après autorisation est nécessaire pour écrire dans les paramètres sécurisé db:

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

Pour les applications non système, seule façon de démarrer le service d'accessibilité est de les diriger vers les paramètres d'accessibilité écran via l'intention et laisser l'utilisateur démarrer manuellement le service:

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); 
+0

Je suis en mesure de faire activer/désactiver mon application de système signé en réglant Settings.Secure.ACCESSIBILITY_ENABLED sur 1 ou 0. Cependant, quand je désactive le talkback en le mettant à 0, une erreur est affichée en disant "Malheureusement, Pico TTS s'est arrêté ". Quelqu'un at-il des suggestions sur la façon d'empêcher l'affichage de ce message d'erreur? – John

+0

supprimez d'abord l'entrée talkback de Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, puis mettez ACCESSIBILITY_ENABLED à 0 – abhishesh

+0

Je reçois toujours la même erreur. Cependant, j'ai remarqué la même chose avec l'application Android Settings standard. Donc je pense que cette erreur est liée à la version de TalkBack que j'ai installée. J'espère qu'une fois que j'aurai les appareils que j'utiliserai, ce ne sera pas un problème. – John

0

De lollipop vous ne pouvez pas modifier tous les paramètres qui brise la sécurité politique. Certains d'entre eux vous pouvez accéder, mais vous devez prendre la permission pour cela. Alors s'il vous plaît ne perdez pas de temps là-dessus.

3

Je pense qu'il pourrait y avoir un moyen de faire que si vous faites votre application un AccessibilityService (mais vous devez l'activer manuellement après l'installation). Ensuite, dans votre classe AccessibilityService, à l'intérieur de la méthode onAccessibilityEvent, vous pouvez explorer les vues (récursivement) et effectuer des clics - dans l'exemple ci-dessous, il cliquera sur l'élément TalkBack dans les paramètres - après il devrait basculer le bouton bascule sur l'écran suivant (le astuce est que vous pouvez cliquer sur parent non le point de vue de commutateur lui-même) - Je n'ai pas essayé ce code :)

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    AccessibilityNodeInfo source = event.getSource();   
    if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) 
     explore(source); 

} 

private void explore(AccessibilityNodeInfo view){ 
    int count = view.getChildCount(); 
    for(int i=0; i<count; i++){ 
     AccessibilityNodeInfo child = view.getChild(i); 
     if(!MODE_TALK_BACK_SCREEN){ 
      if(child.getText()!=null && child.getText().toString().toLowerCase().contains("TalkBack")){ 
       child.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); 
       MODE_TALK_BACK_SCREEN=true; 
       return; 
      } 
     }else{ 
      if("ToggleButton".equals(child.getClassName().toString())){ //there ony one toggle button on the screen 
       child.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); 
       performGlobalAction(GLOBAL_ACTION_BACK); 
       performGlobalAction(GLOBAL_ACTION_BACK);//need to go back two time - i don't know if that will work :) 
       return; 
      } 
     } 
     explore(child); 
     child.recycle(); 
    } 

maintenant si vous les paramètres d'accessibilité ouverts avec Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); il effectue des clics pour vous - vous devrait en quelque sorte couvrir avec toast en plein écran ou service avec vue

Je travaille actuellement sur bascule en mode avion automatique et il fonctionne - devrait donc faire le travail dans votre cas

jeter un oeil sur mon serviceconfig.xml

<accessibility-service  xmlns:android="http://schemas.android.com/apk/res/android" 
android:description="@string/accessibility_service_description" 
android:packageNames="com.android.settings" 
android:accessibilityEventTypes="typeWindowStateChanged" 
android:accessibilityFlags="flagDefault" 
android:accessibilityFeedbackType="feedbackSpoken" 
android:notificationTimeout="100" 
android:canRetrieveWindowContent="true" 
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" 
/>