android Accessibility-service突然停止触发事件

时间:2017-09-28 10:07:04

标签: java android whatsapp accessibilityservice

我有一个AccessibilityService工作正常,但由于某些原因在开发过程中它停止工作。我似乎无法找到那个理由。请查看我的代码,并说明它为什么不起作用。

public class MyServicee extends AccessibilityService {

public static final String TAG = "volumeMaster";

@TargetApi(Build.VERSION_CODES.KITKAT)
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    List<CharSequence> eventText;

    Log.v(TAG, "***** onAccessibilityEvent");

    final int eventType = event.getEventType();

    switch (eventType) {

        case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:

            break;
    }

    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) {

    }



}

private String processUSSDText(List<CharSequence> eventText) {
    for (CharSequence s : eventText) {
        String text = String.valueOf(s);
        if (true) {
            return text;
        }
    }
    return null;
}

@Override
public void onInterrupt() {
    Log.v(TAG, "***** onInterrupt");
}


@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onServiceConnected() {
    Log.v(TAG, "***** onServiceConnected");

    AccessibilityServiceInfo info = getServiceInfo();
    info.eventTypes =
            AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED
                    | AccessibilityEvent.TYPE_VIEW_CLICKED
                    | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;

    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
    info.packageNames = new String[]{"com.whatsapp"};
    info.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    setServiceInfo(info);
    super.onServiceConnected();
}

}

这是Manifest的相关部分:

    <service android:name=".MyServicee"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data android:name="android.accessibilityservice"
            android:resource="@xml/myservice" />
    </service>

这是myserviceconfig.xml:

<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewClicked|typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:canRetrieveWindowContent="true"
android:accessibilityFlags="flagIncludeNotImportantViews|flagRequestFilterKeyEvents"
android:notificationTimeout="1"
android:packageNames="com.whatsapp"
android:settingsActivity="@string/app_name" />

代码尝试检测用户何时启动了呼叫记录服务。

1 个答案:

答案 0 :(得分:0)

您的配置存在一些问题:

首先在onServiceConnected函数中,覆盖系统构造的辅助功能信息。

AccessibilityServiceInfo info = getServiceInfo();
info.eventTypes =
        AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED
                | AccessibilityEvent.TYPE_VIEW_CLICKED
                | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;

info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.packageNames = new String[]{"com.whatsapp"};
info.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
setServiceInfo(info);
super.onServiceConnected();

这整个代码块是不必要的,并且都是由serviceConfig XML文件中的类似行完成的。只要省略它,如果你不能省略它,你的配置就会出现问题,尽管除此之外的所有内容似乎都没问题。

现在,谈到让你的service_config xml文件说不出话来,让我们来谈谈几行:

android:notificationTimeout="1"

1 MS的通知超时基本上没有价值。

android:packageNames="com.whatsapp"

您真的想将可访问性事件限制为仅一个应用程序吗?

android:settingsActivity="@string/app_name"

这是settingsActivity属性的绝对无效值。 settings活动应该是应用程序中活动类的名称。 EX:com.yourpackage.SettingsActivity。可以安全地省略此属性。

除了这些信息之外,在完全陈旧的状态下获取可访问性服务相当容易。有一个守护进程服务,在后台运行,保持您的服务表单开始,但实际上没有做有成效的事情。解决此问题的唯一方法是重启设备。有时您甚至必须卸载软件包,然后重新启动设备,然后重新安装软件包。