AccessibilityService不返回视图ID

问题描述:

我正在编写一个Android的可访问服务,它依赖于获取当前选定视图的视图ID,但是在某些设备上(Nexus 6P 6.0.1,Samsung Galaxy S6 edge + 5 + 6.0.1 )通过和其他人(HTC One M8 5.0.1),我没有看到身份证。因为它在某些设备上工作正常,所以我确定我的代码没有问题,但是我已经在下面发布了一个最小的测试用例。AccessibilityService不返回视图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"); 
    } 
} 

的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" /> 

它是已知的问题,并张贴到AOSP问题追踪器前一段时间。你可以在这里检查问题的状态:“Accessibility Issue: flagReportViewIds has no effect on real devices in Android M”。

不幸的是即使在最新的Android 7.0上也存在问题,但我发现了简单的解决方法。您可以拨打refresh()方法AccessibilityNodeInfo对象刷新它并收集包括id在内的所有错过的数据。

类似的东西:

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

完美答案! –

+0

有什么办法从事件源获取**活动**名称?我想发送一个接收器到那个活动,可能吗?请告诉我 –

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

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

返回正确的视图id