Android: Comment vérifier si un service D'accessibilité particulier est activé

j'ai écrit une application Android qui nécessite l'utilisation de la AccessibilityService . Je sais comment vérifier si L'accessibilité est activée ou désactivée au téléphone, mais je ne peux pas trouver un moyen de déterminer si mon application a été activée spécifiquement dans le menu accessibilité.

je veux demander à l'utilisateur si le AccessibilityService ne fonctionne pas, mais je ne peux pas trouver un bon moyen de le faire. Y a-t-il des méthodes API qui pourraient me manquer? pouvez-vous me dire quels services d'accessibilité sont activés sur l'appareil?

35
demandé sur naXa 2011-02-22 19:48:13

8 réponses

j'ai moi-même élaboré celui-ci à la fin:

    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;
}
61
répondu Andrew 2014-02-26 16:15:46

depuis niveau API 14 , il est également possible d'obtenir les services d'accessibilité en cours d'exécution à travers le 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;
}

pour connaître L'ID de votre et de tous les services d'accessibilité installés, vous pouvez exécuter l'extrait de code suivant:

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

dans mon exemple, L'ID ressemblait à org.votre.paquet./YourAccessibilityService.

jusqu'à présent, la méthode travaillé fiable.

41
répondu Martin 2018-09-27 15:12:18

vérification si le service est activé

/**
 * 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;
}

Utilisation:

boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);

détection lorsque le service est activé ou désactivé

faire un rappel:

ContentObserver observer = new ContentObserver() {
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        boolean accessibilityServiceEnabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
        //Do something here
    }
};

S'abonner:

Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);

désabonnez-vous quand vous avez terminé:

context.getContentResolver().unregisterContentObserver(observer);

Notez que cela ne fonctionne pas avec la getEnabledAccessibilityServiceList() approche car ses valeurs étaient désynchronisées avec les valeurs Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES . C'est pourquoi je pense que l'utilisation de Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES est une meilleure approche unique.

12
répondu Sam 2017-09-29 21:15:05

pouvez-vous juste garder une trace de si le service fonctionne comme ça? Si le service d'accessibilité est activé, ne devrait-il pas aussi fonctionner??

public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false; 

 @Override
    public void onServiceConnected() {
      isEnabled = true; 
    }
 @Override 
    public void onDestroy(){ 
      isEnabled = false; 
    }
5
répondu user3157940 2014-11-24 15:09:10

obtenez L'ID lorsque votre service d'activité vient de commencer. Dans votre activité service OnSeriviceCeonnected après tous les appels initialiser. L'utilisation de ce...

AccessibilityServiceInfo serviceInfo = this.getServiceInfo();
    String accessibilityId = serviceInfo.getId();

nécessite une API De Gelée De Haricots

alors vous pouvez utiliser le code de Martin (isAccessibilityEnabled) pour vérifier les services en cours d'exécution.

2
répondu DarthJaiz 2015-02-09 17:46:36

C'est peut-être trop tard, Mais voici comment je vérifie le statut du service D'accessibilité:

$ adb shell dumpsys accessibility

résultat:

ACCESSIBILITY MANAGER (dumpsys accessibility)
User state[attributes:{id=0, currentUser=true, accessibilityEnabled=false, touchExplorationEnabled=false, displayMagnificationEnabled=false}
           services:{}]
0
répondu Banana droid 2018-08-06 07:20:22
 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 sera appelé à chaque fois que l'état est changé vous pouvez garder une trace de la booléen pour vérifier l'autorisation c'est de loin la solution la plus simple et la plus légère pour vérifier la permission

-1
répondu Priyank Patel 2016-09-06 20:26:28

ce besoin de plus de temps

AccessibilityManager am = (AccessibilityManager) context
        .getSystemService(Context.ACCESSIBILITY_SERVICE);
-2
répondu wanghy 2014-02-23 10:30:27