首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccessibilityService不返回视图ids

AccessibilityService不返回视图ids
EN

Stack Overflow用户
提问于 2016-04-22 11:53:25
回答 2查看 4.6K关注 0票数 8

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

有人能帮我在所有设备上获得服务报告ids吗?

A11y服务

代码语言:javascript
复制
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");
  }
}

The AndroidManifest.xml

代码语言:javascript
复制
<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>

serviceconfig.xml

代码语言:javascript
复制
<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" />
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-22 11:56:05

这是已知的问题,并已张贴到AOSP问题跟踪器一段时间前。您可以在这里检查问题的状态:"可访问性问题: flagReportViewIds对Android中的实际设备没有影响“。

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

就像这样:

代码语言:javascript
复制
public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo ani = event.getSource();
    if (ani != null) {
        ani.refresh(); // to fix issue with viewIdResName = null on Android 6+
    }
}
票数 10
EN

Stack Overflow用户

发布于 2016-04-22 12:36:22

我发现,如果viewId不可用,那么查询焦点元素似乎是可行的:

代码语言:javascript
复制
    AccessibilityNodeInfo source = findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
    viewIdResourceName = source.getViewIdResourceName();

返回正确的视图id。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36793154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档