异常:回调必须在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)

感觉与我没有真正注意到的可访问性问题有关,但我如何开始解决这个问题?调用堆栈没有指向任何方向

我尝试添加一个contentdescription xml标签到所有的地方在我的代码,lint告诉我它丢失了,但它没有帮助

编辑:发现了这个问题,当我在地图片段上方显示StreetViewPanoramaFragment时,当触摸探索(反馈?)被启用时,崩溃发生了。

我不知道是什么原因,我想我应该打开一个单独的更有针对性的问题

发现问题,当我在地图片段上方显示StreetViewPanoramaFragment时,当触摸探索(反馈?)被启用时,崩溃发生。

我不知道是什么原因,我想我应该打开一个单独的更有针对性的问题

问题是"我如何开始修复这个问题?",所以我会说:开始查看框架代码。

我可以追踪到createAccessibilityNodeInfo()实际上来自View.createAccessibilityNodeInfo()

也搜索"回调必须在populateNodeForVirtualViewId()中设置父边界"我发现这是在类ExploreByTouchHelper.java中的第395行调用的。

在不了解代码的情况下我不能说更多,但这是一个很好的起点。

这可能是在ICS之前的android版本中运行时支持v4库中的错误。运行时异常由explorbytouchhelper抛出

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

node.getBoundsInParent调用是在一个AccessibilityNodeInfoImpl实现基于android版本的代码运行,你可以看到在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;

似乎可访问性nodeinfostubimpl是一个空存根,所以你可以尝试在模拟器中运行的东西<</p>

如何开始修复这个问题?

第一步是去混淆你的stacktrace

. lang。回调必须设置父边界populatendeforvirtualviewid () at iv.a(SourceFile:56) atiw.a(SourceFile:716) at hq.a(SourceFile:112) athw.createAccessibilityNodeInfo(源文件:42)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)

织物。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()

最新更新