Подтвердить что ты не робот

Android: как вы проверяете, включен ли определенный AccessibilityService

Я написал приложение для Android, которое требует использования AccessibilityService. Я знаю, как проверить, включена ли функция "Доступность" или отключена на телефоне, но я не могу найти способ определить, было ли мое приложение специально включено в меню доступности.

Я хочу пригласить пользователя, если AccessibilityService не работает, но не может найти хороший способ сделать это. Существуют ли какие-либо API-методы, которые могут отсутствовать, что позволит мне узнать, какие службы доступности включены на устройстве?

4b9b3361

Ответ 1

В конце концов я работал над этим:

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

Ответ 2

Начиная с уровня API 14, также можно получить доступные службы доступности через 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;
}

Чтобы узнать идентификатор вашей и всех установленных служб доступности, вы можете выполнить следующий фрагмент кода:

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

В моем примере идентификатор выглядел как org.your.package/.YourAccessibilityService.

До сих пор метод работал надежно.

Ответ 3

Проверка включенности службы

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

Использование:

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

Обнаружение, когда услуга включена или отключена

Сделайте обратный вызов:

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

Подписаться:

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

Отказаться от подписки, когда вы закончите:

context.getContentResolver().unregisterContentObserver(observer);

Обратите внимание, что это не работает с подходом getEnabledAccessibilityServiceList(), поскольку его значения не синхронизировались с Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES. Вот почему я думаю, что использование Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES - это лучший подход, основанный на одном размере.

Ответ 4

Можете ли вы просто отслеживать, работает ли служба так? Если служба доступности включена, не следует ли ее запускать?

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

 @Override
    public void onServiceConnected() {
      isEnabled = true; 
    }
 @Override 
    public void onDestroy(){ 
      isEnabled = false; 
    }

Ответ 5

Получите идентификатор, когда только началось действие вашей службы активности. В службе активности OnSeriviceCeonnected после всех вызовов инициализации. Используйте это...

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

Требуется Jelly Bean API

Затем вы можете использовать код Мартина (isAccessibilityEnabled), чтобы проверить запущенные службы.

Ответ 6

нужно больше раз

AccessibilityManager am = (AccessibilityManager) context
        .getSystemService(Context.ACCESSIBILITY_SERVICE);

Ответ 7

 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 будет вызываться всякий раз, когда изменяется состояние вы можете отслеживать логическое значение для проверки разрешения это, безусловно, самое простое и легкое решение для проверки разрешения