我正在注册AccessibilityService来监听应用程序更改。它可以在我测试的所有手机上运行,但在Android 5.0的Galaxy A3上运行失败,因为AccessibilityEvent.getPackageName()返回null。应该设置packageName,因为它是一个常规应用程序,从Google Play下载,与之交互。
有谁知道为什么这个以及如何解决它?
在我的代码的相关部分下面。
<service
android:name=".presentation.view.services.LockService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<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 onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
event.getPackageName() // returns NULL;
}
由于文档没有具体解释这一点,我将尝试提供一些我在使用AccessibilityService
后想出来的东西。我写这篇文章是因为其他人正在敲打他们的头,因为event.getPackageName()
总是返回null
,但不要把我的话理所当然。
从可访问性服务的文档中,我看到您可以设置属性android:packageNames="@strings/blah_blah"
,其中blah_blah
是我们的服务将观察的包名称的逗号分隔列表。
如果我们指定了这个属性,我们将只收到那些特定包的通知,event.getPackageName()
将返回正确的包名。
如果我们未设置此属性或我们专门将其设置为null
,我们将收到所有发生事件的通知,但我们将无法识别“生成”可访问性事件的任何特定包。
由于这个AccessibilityServiceInfo
属性可以动态设置,理论上你可以获取当前安装的软件包列表,并将其设置为服务将监控的packageNames
。
@Override
protected void onServiceConnected() {
super.onServiceConnected();
AccessibilityServiceInfo info = getServiceInfo();
// your other assignments
info.packageNames = new String[]{...};
setServiceInfo(info);
}