2

我在 android 中使用 Accessibility 服务来检测前台应用程序。

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

TYPE_VIEW_TEXT_CHANGED

TYPE_WINDOW_STATE_CHANGED

我想收听所有window state change正在工作的事件,但对于第二个事件,我想只收听view_text_changed1-2 个应用程序的事件,而不是全部。

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

有没有其他方法可以做到这一点?

4

2 回答 2

1

不幸的是,没有办法为指定的可访问性事件指定有趣的包名称。您只需使用AccessibilityEvent#getPackageName来过滤您感兴趣的包。

于 2016-05-17T17:34:08.390 回答
1

假设您已经设置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");
    }
}

希望能帮助到你!

于 2017-02-16T18:07:55.893 回答