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+
}
}
答
我发现,如果viewId不可用,查询聚焦元素似乎工作:
AccessibilityNodeInfo source = findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
viewIdResourceName = source.getViewIdResourceName();
返回正确的视图id
完美答案! –
有什么办法从事件源获取**活动**名称?我想发送一个接收器到那个活动,可能吗?请告诉我 –