J'ai écrit une application Android nécessitant l'utilisation de AccessibilityService
. Je sais comment vérifier si Accessibility est activé ou désactivé sur le téléphone, mais je ne peux pas trouver un moyen de déterminer si mon L'application a été spécifiquement activée dans le menu d'accessibilité.
Je souhaite demander à l'utilisateur si la AccessibilityService
n'est pas en cours d'exécution, mais ne trouve pas un bon moyen de le faire . Y a-t-il des méthodes d'API qui me manquent qui me permettraient de connaître les services d'accessibilité activés sur l'appareil?
J'ai travaillé 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;
}
Depuis API niveau 14 , il est également possible d’obtenir les services d’accessibilité activés à l’aide de la variable AccessibilityManager
:
public static boolean isAccessibilityServiceEnabled(Context context, Class<? extends AccessibilityService> service) {
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
for (AccessibilityServiceInfo enabledService : enabledServices) {
ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;
if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(service.getName()))
return true;
}
return false;
}
Usage:
boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
/**
* 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;
}
Usage:
boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
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
}
};
Souscrire:
Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);
Se désabonner lorsque vous avez terminé:
context.getContentResolver().unregisterContentObserver(observer);
Notez que cela ne fonctionne pas avec l'approche getEnabledAccessibilityServiceList()
car ses valeurs ne sont pas 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.
Pouvez-vous simplement savoir si le service fonctionne comme ceci? Si le service d'accessibilité est activé, ne devrait-il pas également s'exécuter?
public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false;
@Override
public void onServiceConnected() {
isEnabled = true;
}
@Override
public void onDestroy(){
isEnabled = false;
}
Obtenez l'ID lorsque votre service d'activité vient juste de commencer . Dans votre service d'activité OnSeriviceCeonnected après tous les appels d'initialisation. Utilisez ceci...
AccessibilityServiceInfo serviceInfo = this.getServiceInfo();
String accessibilityId = serviceInfo.getId();
Requiert l'API Jelly Bean
Ensuite, vous pouvez utiliser le code de Martin (isAccessibilityEnabled) pour vérifier les services en cours d'exécution.