如何安全地打开web视图缩放,并根据需要关闭缩放、视图、根据、安全

2023-09-04 03:16:42 作者:无谓的托词。

正如这个悬而未决的问题:WebView罚球接收器未注册:android.widget.ZoomButtonsController

通过启动,并根据需要关闭的WebView缩放控件抛出这样的:

  java.lang.IllegalArgumentException:如果接收器未注册:android.widget.ZoomButtonsController
 

对于一些用户。我自己还没有看到这个崩盘,但我已经看到它在野外的设备即将在日志中。它不会发生超频繁,但它是一个崩溃不管。任何想法?

感谢

更新:如何重现

我发现了如何重现此崩溃:http://$c$c.google.com/p/android/issues/detail?id=15694

我会报到,如果我发现了一个解决方法。

按照要求,完整的堆栈跟踪:

  java.lang.IllegalArgumentException:如果接收器未注册:android.widget.ZoomButtonsController$1@487a4290
在android.app.ActivityThread $ PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
在android.app.ContextImpl.unregisterReceiver(ContextImpl.java:913)
在android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
在android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:404)
在android.widget.ZoomButtonsController $ 2.handleMessage(ZoomButtonsController.java:178)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:4627)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
在dalvik.system.NativeStart.main(本机方法)
 

和其他类似之一:

  java.lang.IllegalArgumentException:如果视图没有连接到窗口管理器
在android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391)
在android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236)
在android.view.Window $ LocalWindowManager.removeView(Window.java:432)
在android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:406)
在android.widget.ZoomButtonsController $ 2.handleMessage(ZoomButtonsController.java:178)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:143)
在android.app.ActivityThread.main(ActivityThread.java:5068)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
在dalvik.system.NativeStart.main(本机方法)
 
怎样将网页视图放大或缩小

解决方案

在一个Xoom的,我发现,如果一个等待变焦控制调用WebView.destroy之前淡出()崩溃不再出现。所以我已经覆盖WebView.destroy()来发布消息到一个处理一个几秒钟后打电话到WebView.destroy()。从web视图源,我们看到的淡出间隔为:

  //时间的变焦控制是渐行渐远之前可见
私有静态最后长ZOOM_CONTROLS_TIMEOUT =
        ViewConfiguration.getZoomControlsTimeout();
 

所以我用ViewConfiguration.getZoomControlsTimeout()+ 1000L作为延迟调用web视图的销毁方法之前。到目前为止,没有崩溃。

As mentioned in this unanswered question: WebView throws Receiver not registered: android.widget.ZoomButtonsController

By turning the WebView zoom controls on and off as needed throws this:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController

For some users. I myself have not seen this crash, but I have seen it in the logs coming from devices in the wild. It doesn't happen super frequently, but it is a crash regardless. Any ideas?

Thanks

Update: How to reproduce

I found how to reproduce this crash: http://code.google.com/p/android/issues/detail?id=15694

I'll report back if I discover a workaround.

As requested, the full stack trace:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController$1@487a4290
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:913)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:404)
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

and another similar one:

java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236)
at android.view.Window$LocalWindowManager.removeView(Window.java:432)
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:406)
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

解决方案

On a Xoom I found that if one waits for the zoom control to fade out before calling WebView.destroy() a crash no longer occurs. So I've overwritten WebView.destroy() to post a message to a Handler to call WebView.destroy() after a few seconds. From WebView source we see the fade-out interval is:

// The time that the Zoom Controls are visible before fading away
private static final long ZOOM_CONTROLS_TIMEOUT =
        ViewConfiguration.getZoomControlsTimeout();

So I used ViewConfiguration.getZoomControlsTimeout() + 1000L as the delay before calling WebView's destroy method. So far no crashes.