Как вы определяете, когда пользователь отключает сервис специальных возможностей в Android?

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

Я думал, когда пользователь выключит его, он будет вызывать onDestroy()но, видимо, это не называется.

Есть ли способ узнать, когда пользователь отключает службу доступности? Или есть функция, которая вызывается всякий раз, когда пользователь отключается?

(На всякий случай, я разрабатываю для Android Wear.)

Спасибо большое!! Я ценю вашу помощь!:)

3 ответа

interface AccessibilityManager.AccessibilityStateChangeListener

Слушатель состояния доступности системы. Чтобы прослушать изменения состояния доступности на устройстве, внедрите этот интерфейс и зарегистрируйте его в системе, вызвав addAccessibilityStateChangeListener,

Пример:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    AccessibilityManager am = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    am.addAccessibilityStateChangeListener(new AccessibilityManager.AccessibilityStateChangeListener() {
        @Override
        public void onAccessibilityStateChanged(boolean b) {
            Log.d(TAG,"onAccessibilityStateChanged b=" + b);
            updateServiceStatus(b);
        }
    });
    updateServiceStatus(am.isEnabled());
}

Больше примеров Java на programcreek.com.

Я не знаю ни о каком событии, трансляции или обратном вызове, который уведомляет приложения об изменениях состояния в Accessibility Service. Лучшее, что я могу придумать, - это периодически проверять статус сервиса вручную:

AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);
boolean isAccessibilityEnabled = am.isEnabled();

Документы: AccessibilityManager # isEnabled ().

Это работает для меня. не срабатывает при активации TalkBack долгим нажатием кнопки громкости, вероятно, потому, что специальные возможности уже включены, а навигация TalkBack — нет. Вероятно, достаточно просто добавить прослушиватель дляaddTouchExplorationStateChangeListener, но на всякий случай я также добавилaddAccessibilityStateChangeListenerслушатель.

Я намеренно не используюStateFlowкоторый запоминает состояние последнего широковещательного значения на случай, если наш прослушиватель изменений не сработает во всех ситуациях, когда нам это нужно. Таким образом, мой графический интерфейс может проверитьisAccessibilityTalkBackEnabledпри создании и слушать черезaccessibilityTalkBackEnabledUpdates.collect{}для обновлений, и у нас всегда будет как минимум то состояние, которое было на момент создания GUI-компонента. Если бы мы использовали StateFlow, а прослушиватель не работал, у нас было бы состояние, которое присутствовало при запуске приложения (точнее, при инициации класса DefaultAndroidApplicationServices).

      interface AndroidApplicationServices {
    val accessibilityTalkBackEnabledUpdates: SharedFlow<Boolean>
    val isAccessibilityTalkBackEnabled: Boolean
}

class DefaultAndroidApplicationServices(context: Context) : AndroidApplicationServices {
    private val am = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager

    override val accessibilityTalkBackEnabledUpdates = MutableSharedFlow<Boolean>()

    override val isAccessibilityTalkBackEnabled: Boolean
        get() {
            return if (am.isEnabled) {
                // am.isEnabled is true on my test-device, when TalkBack is off, but below check works
                am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN).isNotEmpty()
            } else false
        }

    init {        
        am.addAccessibilityStateChangeListener {
            CoroutineScope(Dispatchers.Main).launch {
                accessibilityTalkBackEnabledUpdates.emit(isAccessibilityTalkBackEnabled)
            }
        }
        am.addTouchExplorationStateChangeListener {
            CoroutineScope(Dispatchers.Main).launch {
                accessibilityTalkBackEnabledUpdates.emit(isAccessibilityTalkBackEnabled)
            }
        }
    }
}
Другие вопросы по тегам