Java android AccessibilityService突然停止触发事件-请检查我的代码

Java android AccessibilityService突然停止触发事件-请检查我的代码,java,android,accessibilityservice,Java,Android,Accessibilityservice,我有一个AccessibilityService,它工作得很好,但在开发过程中由于某种原因它停止了工作。我似乎找不到那个原因。请看一下我的代码,告诉我为什么它不工作 public class MyAccessibilityService extends AccessibilityService { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onAccessibilityEvent(Accessi

我有一个AccessibilityService,它工作得很好,但在开发过程中由于某种原因它停止了工作。我似乎找不到那个原因。请看一下我的代码,告诉我为什么它不工作

public class MyAccessibilityService extends AccessibilityService {

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

    Toast.makeText(this, "event triggered", Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceConnected() {
    AccessibilityServiceInfo config = new AccessibilityServiceInfo();
    config.eventTypes = AccessibilityEvent.TYPE_WINDOWS_CHANGED;
    config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

    config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

    setServiceInfo(config);
    super.onServiceConnected();
}
以下是舱单的相关部分:

 <service
        android:name=".MyAccessibilityService"
        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/myserviceconfig" />
    </service>

下面是myserviceconfig.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service android:accessibilityEventTypes="typeWindowsChanged"
android:notificationTimeout="100"
android:accessibilityFeedbackType="feedbackGeneric"
android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
android:canRetrieveWindowContent="true"
xmlns:android="http://schemas.android.com/apk/res/android" />


代码试图检测用户何时启动了第三方应用程序的新活动。

下面的功能肯定有问题

@Override
public void onServiceConnected() {
    AccessibilityServiceInfo config = new AccessibilityServiceInfo();
    config.eventTypes = AccessibilityEvent.TYPE_WINDOWS_CHANGED;
    config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

    config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

    setServiceInfo(config);
    super.onServiceConnected();
}
该行: AccessibilityServiceInfo配置=新的AccessibilityServiceInfo()

当然是不恰当的。通过获取未初始化的服务配置对象,您已经删除了在服务配置XML文件中所做的任何配置。事实上,没有理由以编程方式进行任何配置,您应该删除此函数,并在服务配置中更改所有这些设置。以下任一解决方案都可以

获取服务当前配置,而不是实例化 新的

只需在服务配置xml文件中进行所有这些更改


请注意,您在代码中添加的标志也可以在服务配置文件中使用!只要用这个,就容易多了。在此解决方案中,您只需完全删除您的
onServiceConnected
覆盖功能

最后

Android无障碍服务的开发相当挑剔!Android Studio并不总能很好地处理崩溃,特别是当它涉及到以可识别的可靠方式将崩溃数据输入LogCat和/或声音崩溃时。跟踪运行时异常可能是一件痛苦的事情。确保当您遇到这样突然的不一致时,您不会按应用程序过滤LogCat!在错误级别检查整个日志,查看堆栈跟踪和异常!另外,尝试卸载服务并再次运行,然后检查整个LogCat输出。打开和关闭设备也会有所帮助。是的,很痛苦


在上述解决方案和这些注释之间,您应该能够找到您的问题。

谢谢!我去掉了onServiceConnection()方法。但我发现由于某种原因,没有调用typeWindowsChanged。有人建议我改用打字机。这对我有用。虽然触发频率更高,但我认为这对稳定性更好。但有一个问题。有时,应用程序决定停止侦听事件,然后我必须重新启动设备才能再次侦听。我想说的是,这要么属于我关于可访问性差的服务开发人员支持的结论段落,要么是您在某处发生了一些异常,而您的服务正在关闭。你必须有非常稳定的服务代码,崩溃并不总是显而易见的!如果您的目标是捕获所有屏幕更新,我建议对事件类型“typeWindowContentChanged | typeWindowsChanged | TypeWindowsStateChanged”进行以下设置。你会得到很多额外的东西,你会想手动过滤掉它们。我在应用商店有多个辅助功能服务,没有一个有问题。我不知道你是不是想说android上的无障碍服务突然出现了新的bug。没有。这个问题太广泛,讨论太长。如果你有更多的疑问,你应该单独问他们。我觉得在这篇文章上继续讨论对更广泛的StackOverflow社区的价值是微乎其微的。
@Override
public void onServiceConnected() {
    AccessibilityServiceInfo config = getServiceInfo();//This IS A REALLY IMPORTANT CHANGE!!! 
    //By instantiating a new "AccessibilityServiceInfo" you have overwritten all of your XML Config changes, as well as any default settings internal to Android! 
    //DON'T instantiate your own ServiceConfig objects!!!! Just don't. In fact, do everything in XML instead!

    config.eventTypes = AccessibilityEvent.TYPE_WINDOWS_CHANGED;
    config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

    config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

    setServiceInfo(config);
    super.onServiceConnected();
}
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowsChanged"
    android:notificationTimeout="100"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
    android:canRetrieveWindowContent="true" />