2015-08-28 111 views
1

我有一个奇怪的问题,似乎只发生在几台物理设备(Nexus 4,Nexus 7)上,所有这些设备都运行最新的Android操作系统。我不能在我的老式LG测试手机上重现它,也不能在我使用的任何Genymotion模拟器中重现它;我已经尝试了各种API级别和各种模拟器设备,并且它从未在模拟器中出现过。Android WebView - 使用Google文档重定向问题打开PDF

问题是,当调用PDF url(使用Google Docs加载它​​)时,它似乎只是一遍又一遍地重新引导,最终失败。我不确定这是幕后实际发生的情况,但它是如何出现的。

如果URL包含“.pdf”,我们有WebViewClient代码来拦截URL并适当更改/加载它。以下是一个Java代码:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (url != null && url.toLowerCase().contains(".pdf")) { 
     url = "http://docs.google.com/gview?embedded=true&url=" + url; 
    } 
    view.loadUrl(url); 
    return true; 
} 

这里是我们使用的WebView设置,如果需要的话:

webview.getSettings().setJavaScriptEnabled(true); 
webview.getSettings().setPluginState(null); 
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
webview.getSettings().setPluginState(PluginState.ON); 
webview.getSettings().setLoadWithOverviewMode(true); 
webview.getSettings().setUseWideViewPort(true); 
webview.getSettings().setSupportZoom(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.clearCache(false); 
webview.getSettings().setBuiltInZoomControls(true); 

在日志中,我们看到了这个被打印一遍又一遍的时候Webview是试图加载(设备在哪里失败):

08-27 17:28:35.135 10460-10460/com.myapp.mobile W/BindingManager﹕ Cannot call determinedVisibility() - never saw a connection for the pid: 10460 
08-27 17:28:35.135 10460-10460/com.myapp.mobile E/url﹕ https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=https://docs.google.com/gview?embedded=true&url=http://<LINK_TO_PDF_FILE>.pdf 

我不知道为什么它的过去,一遍又一遍的追加,谷歌文档的URL,但我怀疑这是问题的一部分。我们怀疑这款应用可能试图使用Google云端硬盘或其他应用来打开它,但我们并非100%。我只是不确定为什么有些设备可以正常工作,但很多设备无法正常工作。

有关如何调试的任何想法?我猜我可能需要稍微改变一下shouldOverrideUrlLoading()方法,但我有点难以理解该做什么。也许view.loadUrl()行会导致该方法一遍又一遍地被调用,但这仍然让我有点难以理解它为什么在某些工作而不在其他设备上工作。

不知道它的问题,但我得到的模拟器(即使网站细拉)运行,即使在日志中打印这一行:

08-29 00:01:45.821 14306-14306/com.myapp.mobile E/url﹕ http://docs.google.com/gview?embedded=true&url=http://<LINK_TO_PDF_FILE>.pdf 

任何意见将不胜感激!

回答

0

有一个解决方案,我们发现,虽然不是很优雅。我们仍然不知道根本原因,但在下面的代码中添加可确保它不会多次将URL“docs.google.com”附加到URL,如果此方法被多次调用(它正在执行,显然由于某些原因在某些设备上):

if (url != null && url.toLowerCase().contains(".pdf") && !url.toLowerCase().contains("docs.google.com")) { 
     url = "https://docs.google.com/gview?embedded=true&url=" + url; 
}