0

我在 Android 中创建了 Accessibility 服务,它在 4.2(Jelly Bean)和 5.1(Lollipop)上完美运行,但在 4.4(KitKat)上却不行。

在 KitKat 上,它不接收任何事件并且根本不调用onAccessibilityEvent

难道我做错了什么?
这是我的实现:

无障碍服务.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeNotificationStateChanged"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:canRetrieveWindowContent="true"
    android:description="@string/app_name"
    android:notificationTimeout="100" />

myAccessibilityService.java

public class myAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent e) {
        if (e.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
             Log.d(TAG, "NOTIFICATION!!");
        }
    }

    @Override
    protected void onServiceConnected() {
        Log.d(TAG, AccessibilityService Connected");
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
        info.flags = AccessibilityServiceInfo.DEFAULT;
        info.notificationTimeout = 100;
        setServiceInfo(info);
    }

    @Override
    public void onInterrupt() {
        Log.d(TAG, "myAccessibilityService onInterrupt Called");
    }

}

AndroidManifest.xml

    <service
        android:name=".myAccessibilityService"
        android:enabled="true"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>

        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice" />
    </service>

当我进入设置并打开服务时,onServiceConnected会调用它并说它已打开并正在运行但它从未调用过onAccessibilityEvent

就像我说的,它适用于 JellyBean 和 Lollipop。那么可能是什么问题呢?

4

2 回答 2

1

当你创建一个新的服务信息时,你会删除很多服务信息的默认属性。我建议获取服务的服务信息,然后操作该对象。我不相信这会解决你的问题,但总的来说这是一个更好的主意。

为了澄清,我建议交换这一行:

AccessibilityServiceInfo info = new AccessibilityServiceInfo();

有了这个:

AccessibilityServiceInfo info = this.getServiceInfo();

这样您就可以从任何 XML 属性、默认构造等中维护默认配置。

于 2015-12-04T03:43:34.590 回答
0

首先,在 中onServiceConnected(),删除除 Log 之外的所有行。

如果您有任何其他具有相同包名称的无障碍服务并为设备上安装的相同事件注册了任何其他无障碍服务,您的无障碍服务可能会错过事件。

还,

1)尝试检查其他事件,如 TYPE_WINDOW_CONTENT_CHANGED 并查看 KitKat 设备是否收到它们。

2) 尝试在不同版本的 KitKat 上运行(可能是版本问题)。

于 2015-12-11T08:59:58.783 回答