使用无障碍服务 Android

Using Accessibility Service Android

我已经在 android 中使用辅助功能服务来检测前台应用程序。

我想收听 2 个可用的辅助功能事件

TYPE_VIEW_TEXT_CHANGED

TYPE_WINDOW_STATE_CHANGED

我想收听所有 window state change 事件,这是有效的,但对于第二个事件,我只想收听 1-2 个应用程序的 view_text_changed 事件,而不是全部。

我已经阅读并尝试了 xml 中的 android:packageNames 参数,但它会对 window_state_changed 事件施加限制。

还有其他方法吗??

遗憾的是,无法为指定的辅助功能事件指定有趣的包名称。你必须只使用 AccessibilityEvent#getPackageName 来过滤你感兴趣的包。

假设您已将 AndroidManifest 设置为识别 AccessibilityService,我将在此处添加其他必需的代码,以防万一有人想要直接回答。

无障碍服务配置文件:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android= "http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:accessibilityEventTypes="typeWindowStateChanged|typeViewTextChanged"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>

注意 android:accessibilityEventTypes 是需要的。如果您将包裹限制在 xml 中,您将无法获得问题中正确指出的 TYPE_WINDOW_STATE_CHANGED

因此,您还需要对 AccessibilityService 的实现进行更改。

public class VoiceAccessibilityService extends android.accessibilityservice.AccessibilityService {
    private static String TAG = VoiceAccessibilityService.class.getName();

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED && event.getPackageName().equals("Your package names")) {
            Logger.d(TAG + " SHOW " + event.toString());

        }
    }

    @Override
    public void onInterrupt() {
        Logger.d(TAG + " interrupt");
    }
}

希望对您有所帮助!