【问题标题】:AccessibilityService not returning view idsAccessibilityService 不返回视图 ID
【发布时间】:2016-04-22 11:53:25
【问题描述】:

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

谁能帮我在所有设备上获取我的服务报告 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");
  }
}

AndroidManifest.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>

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

【问题讨论】:

    标签: android accessibility android-a11y


    【解决方案1】:

    这是已知问题,不久前已发布到 AOSP 问题跟踪器。您可以在此处查看问题状态:“Accessibility Issue: flagReportViewIds has no effect on real devices in 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+
        }
    }
    

    【讨论】:

    • 完美答案!
    • 有什么方法可以从事件源中获取 activity 名称吗?我想向那个活动发送一个接收器,有可能吗?请告诉我
    • 我没有从在 android 9.0 上运行的应用程序中获取硬编码文本,硬编码文本如用户无法更改的文本,如“关于应用程序”等。最近有没有无障碍服务的变化,因为它似乎在牛轧糖上运行良好。完整的问题在这里stackoverflow.com/questions/54880922/…,如果你能提供帮助。
    【解决方案2】:

    我发现如果 viewId 不可用,查询焦点元素似乎可以工作:

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

    返回正确的视图 ID

    【讨论】:

    • 我没有从在 android 9.0 上运行的应用程序中获取硬编码文本,硬编码文本如用户无法更改的文本,如“关于应用程序”等。最近有没有无障碍服务的变化,因为它似乎在牛轧糖上运行良好。完整的问题在这里stackoverflow.com/questions/54880922/…,如果你能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2010-11-15
    • 2017-09-15
    相关资源
    最近更新 更多