辅助功能服务不返回视图 ID



我正在Android中编写一个访问性服务,该服务依赖于获取当前所选视图的视图ID,但是在某些设备上(Nexus 6P 6.0.1,三星Galaxy S6 edge+ 5 + 6.0.1)我没有通过其他(HTC One M8 5.0.1)获得视图ID,它很好。 因为它在某些设备上运行良好,所以我确定我的代码没有问题,但是我在下面发布了一个最小的测试用例。

任何人都可以帮助我获取所有设备上的服务报告 ID?

A11y 服务

public class ViewIdLoggingAccessibilityService extends AccessibilityService {
  @Override
  public void onAccessibilityEvent(AccessibilityEvent event) {
      AccessibilityNodeInfo source = event.getSource();
      if (source == null) {
          Log.d("onAccessibilityEvent", "source was null for: " + event);
      } else {
          String viewIdResourceName = source.getViewIdResourceName();
          Log.d("onAccessibilityEvent", "viewid: " + viewIdResourceName);
      }
  }
  @Override
  public void onInterrupt() {
      Log.d("!# onInterrupt", "called");
  }
}

安卓清单.xml

<manifest package="com.example.a11yservice"
          xmlns:android="http://schemas.android.com/apk/res/android"
    >
  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      >
    <service
        android:name=".ViewIdLoggingAccessibilityService"
        android:label="@string/view_id_logging_service_label"
        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/serviceconfig"
          />
    </service>
  </application>
</manifest>

服务配置.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100" />
这是

已知问题,前段时间发布到 AOSP 问题跟踪器。您可以在此处查看问题的状态:"辅助功能问题:flagReportViewIds 对 Android M 中的真实设备没有影响"。

不幸的是,即使在最新的Android 7.0上也存在问题,但我找到了简单的解决方法。您可以在AccessibilityNodeInfo对象上调用refresh()方法来刷新它并收集所有丢失的数据,包括 id。

像这样:

public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo ani = event.getSource();
    if (ani != null) {
        ani.refresh(); // to fix issue with viewIdResName = null on Android 6+
    }
}

我发现如果 viewId 不可用,查询焦点元素似乎有效:

    AccessibilityNodeInfo source = findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
    viewIdResourceName = source.getViewIdResourceName();

返回正确的视图 ID

相关内容

  • 没有找到相关文章

最新更新