AccessibilityEvent.getPackageName()返回null

问题描述 投票:5回答:1

我正在注册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;
}
java android accessibilityservice
1个回答
1
投票

由于文档没有具体解释这一点,我将尝试提供一些我在使用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);
}
© www.soinside.com 2019 - 2024. All rights reserved.