[英]How to detect when user turns on/off talkback in android programmatically
[英]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();
這對我有用。 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.