Android无障碍服务突然停止触发事件。

3

我有一个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>

这是我的serviceconfig.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" />

该代码试图检测用户何时启动了通话录音服务。

你找到这个问题的解决方案了吗? - iflorit
1个回答

3
你的配置存在一些问题:
首先,在你的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毫秒基本上没有任何意义。
android:packageNames="com.whatsapp"

您真的希望将无障碍事件限制在一个应用程序中吗?

android:settingsActivity="@string/app_name"

这是settingsActivity属性的绝对无效值。设置活动应该是您应用程序中的一个活动类的名称。例如:com.yourpackage.SettingsActivity。这个属性可以安全地省略。

除了这些信息,让辅助功能服务完全停滞不前也相当容易。有一个守护进程服务在后台运行,防止您的服务启动,但实际上并没有做有意义的事情。唯一的解决方法是重新启动设备。有时甚至需要卸载您的软件包,然后重新启动设备,再重新安装您的软件包。


谢谢你的回复,@Chris CM。但问题是,当代码抛出异常时,服务在Whatsapp意外停止后仍然能正常工作12秒钟。所以请给我一些建议。 - Secret
1
如果您的服务抛出异常,您应该在问题中附上堆栈跟踪。在调试问题时,没有比堆栈跟踪更有帮助的信息了。 - MobA11y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接