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

时间:2017-07-30 12:49:18

标签: java android accessibilityservice

我有一个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();
}

这是Manifest的相关部分:

 <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" />

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

1 个答案:

答案 0 :(得分:1)

以下功能肯定是有问题的。

@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 config = new AccessibilityServiceInfo();

肯定是不合适的。通过获取未初始化的服务配置对象,您已删除了在服务配置XML文件中执行的任何配置。实际上,没有理由以编程方式执行任何配置,您应该只删除此功能,并更改服务配置中的所有这些设置。以下解决方案可以使用。

  

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

@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文件中进行所有这些更改。

<?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" />

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

  

最后

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

在上述解决方案和这些说明之间,您应该能够找到问题所在。