11

我有一个 AccessibilityService 可以读出任何传入的通知。它确实适用于 ICS 及以下版本,但停止使用 JB。

以下是清单和代码:

<service
        android:name=".Services.InstantMessengerJb"
        android:enabled="@bool/is_post_jb"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        tools:ignore="ExportedService" >
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />

        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    </service>

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    SettingsClass.logMe(tag, "New event!");
    new AccessibilityProcessing(this, event);
}

@Override
protected void onServiceConnected() {
    if (isInit) {
        return;
    }
    SettingsClass.logMe(tag, "We are connected!");
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    setServiceInfo(info);
    isInit = true;
}

如前所述,它确实可以像魅力一样在所有 preJB-Devices 上工作,但是在 JB 上服务启动(我得到“我们已连接”),但没有触发任何事件。

代码有什么问题吗?

4

2 回答 2

18

这是我让它工作的方式:

  1. 子类化服务类,因此有 2 个版本。

  2. 在 res/values 目录中有一个 bools.xml 文件,在 res/values-v16 目录中也有一个

  3. 在 v16 中将 is_jelly_bean 布尔值设置为 true,在 res/values 目录版本中设置为 is_not_jelly_bean

  4. 在清单中有这样的东西

    <service android:name=".service.MainRunningService" android:enabled="@bool/is_jelly_bean"
        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>
    
    <service android:name=".service.MainRunningServicePreJellyBean" 
        android:enabled="@bool/is_not_jelly_bean">
        <intent-filter >
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice" />
    </service>
    

在 res/xml 目录调用accessibilityservice.xml中有一个无障碍服务xml文件

里面有这样的东西:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:description="@string/description_that_shows_on_the_accessibility_page" />
于 2012-08-20T17:49:37.790 回答
2

我在 Android 4.1.1 中遇到了这个问题。在我禁用并重新启用无障碍服务之前,无障碍服务没有收到事件。

为了解决这个问题,我在 setServiceInfo()和中定义了无障碍服务参数accessibilityservice.xml

在我的例子中,没有必要定义两个不同的 Android 版本相关的无障碍服务。

于 2015-06-12T10:38:42.003 回答