exception:callback函数必须在populateNodeForVirtualViewId()中设置父界限

我的Android应用程序崩溃报告服务报告了许多实例:

java.lang.RuntimeException: Callbacks must set parent bounds in populateNodeForVirtualViewId() at iv.a(SourceFile:56) at iw.a(SourceFile:716) at hq.a(SourceFile:112) at hw.createAccessibilityNodeInfo(SourceFile:42) at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:724) at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:147) at android.view.AccessibilityInteractionController.access$300(AccessibilityInteractionController.java:49) at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:971) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5140) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) at dalvik.system.NativeStart.main(Native Method) 

感觉连接到可访问性问题我没有真正照顾,但我该如何开始解决这个问题? 调用堆栈并不指向任何方向

我试着添加一个contentDescpription xml标签到我的代码中的所有地方,林特通知我它失踪了,但没有帮助

编辑:发现问题,当我通过触摸(对讲?)被启用时,在地图片段上方显示StreetViewPanoramaFragment时发生崩溃。

我不知道是什么原因造成的,我想我会另外打开一个更有针对性的问题

Solutions Collecting From Web of "exception:callback函数必须在populateNodeForVirtualViewId()中设置父界限"

发现问题,当我通过touch(talkback?)被启用时,在地图片段上方显示StreetViewPanoramaFragment时发生崩溃。

我不知道是什么原因造成的,我想我会另外打开一个更有针对性的问题

那么问题是“我该如何开始修复这个?”,所以我会说:开始寻找框架代码。

我可以追踪到, createAccessibilityNodeInfo()实际上是从View.createAccessibilityNodeInfo()

还search“callback必须在populateNodeForVirtualViewId()设置父界”我发现这是在ExploreByTouchHelper.java类395行调用。

如果不知道你的代码,我不能再多说了,但这对你的追求来说是一个很好的起点。

这可能是一个支持v4 lib的bug,当在比ICS更早的android版本中运行时。 运行时exception由ExploreByTouchHelper引发

 393 node.getBoundsInParent(mTempParentRect); 394 if (mTempParentRect.isEmpty()) { 395 throw new RuntimeException("Callbacks must set parent bounds in " 396 + "populateNodeForVirtualViewId()"); 397 } 

node.getBoundsInParent调用是在一个基于代码运行的android版本的AccessibilityNodeInfoImpl实现中实现的,如你在AccessibilityNodeInfoCompat

 755 static { 756 if (Build.VERSION.SDK_INT >= 19) { // KitKat 757 IMPL = new AccessibilityNodeInfoKitKatImpl(); 758 } else if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2 759 IMPL = new AccessibilityNodeInfoJellybeanMr2Impl(); 760 } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean 761 IMPL = new AccessibilityNodeInfoJellybeanImpl(); 762 } else if (Build.VERSION.SDK_INT >= 14) { // ICS 763 IMPL = new AccessibilityNodeInfoIcsImpl(); 764 } else { 765 IMPL = new AccessibilityNodeInfoStubImpl(); 766 } 767 } 768 769 private static final AccessibilityNodeInfoImpl IMPL; 

而且似乎AccessibilityNodeInfoStubImpl是一个空的存根,所以你可以在模拟器中运行一些<14的东西,看看你是否得到exception。

我该如何开始解决这个问题?

第一步是去混淆你的堆栈跟踪

java.lang.RuntimeException:callback函数必须在hw.createAccessibilityNodeInfo(SourceFile:42)的hq.a(SourceFile:112)处的i.a.(SourceFile:716)处的iv.a(SourceFile:56)处的populateNodeForVirtualViewId )在android.view.AccessibilityInteractionController $ AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:724)

作为参考,我得到这个堆栈跟踪,看起来像你的消除混淆的版本:

 java.lang.RuntimeException: Callbacks must set parent bounds in populateNodeForVirtualViewId() at android.support.v4.widget.EdgeEffectCompat$EdgeEffectImpl.newEdgeEffect(SourceFile:56) at android.support.v4.widget.EdgeEffectCompat$EdgeEffectLollipopImpl.a(SourceFile:717) at android.support.v4.view.accessibility.AccessibilityNodeProviderCompatKitKat.a(SourceFile:112) at android.support.v4.view.accessibility.AccessibilityRecordCompat$AccessibilityRecordImpl.createAccessibilityNodeInfo(SourceFile:42) at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfVirtualNode(AccessibilityInteractionController.java:1092) at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1002) at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:998) at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:799) at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:155) at android.view.AccessibilityInteractionController.access$400(AccessibilityInteractionController.java:53) at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1146) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

Fabric.io也透露有一个街景线程正在运行:

 thread at java.lang.Object.wait(Object.java) at com.google.maps.api.android.lib6.gmm6.streetview.bf.a() at com.google.maps.api.android.lib6.gmm6.streetview.bf.run()