簡體   English   中英

您如何檢測用戶何時關閉 Android 中的無障礙服務?

[英]How do you detect when user turns off accessibility service in Android?

我正在 Android 中開發無障礙服務。 當用戶關閉輔助功能服務時,我想禁用某些功能,但我不確定如何檢測到這一點。

我想當用戶關閉它時,它會調用onDestroy() ,但顯然它沒有被調用。

有什么方法可以知道用戶何時關閉無障礙服務? 或者是否有一個函數在用戶關閉時被調用?

(以防萬一,我正在為 Android Wear 開發。)

非常感謝!! 我感謝您的幫助! :)

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

programcreek.com上的更多 java 示例。

我不知道任何通知應用程序有關無障礙服務狀態更改的事件、廣播或回調。 我能想到的最好的事情是偶爾手動檢查服務狀態:

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

文檔: AccessibilityManager#isEnabled()

這對我有用。 addAccessibilityStateChangeListener在使用長按音量按鈕快捷方式激活 TalkBack 時不會觸發,可能是因為輔助功能已啟用,但 TalkBack 導航未啟用。 addTouchExplorationStateChangeListener添加監聽器可能就足夠了,但為了安全起見,我還添加了一個addAccessibilityStateChangeListener監聽器。

我故意不使用狀態StateFlow來記住最后廣播值的狀態,以防我們的更改偵聽器在我們需要它的所有情況下都不會觸發。 這樣,我的 GUI 可以在創建時檢查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)
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM