我有一个奇怪的问题,似乎只在一些物理设备(Nexus 4,Nexus 7)上发生,所有这些都运行最新的Android操作系统。我不能在我的旧LG测试手机上重现它,也不能在我使用的任何Genymotion模拟器中重现它;我尝试过各种各样的API级别和各种模拟器设备,而且它永远不会出现在模拟器中。
问题在于,当调用PDF网址(使用Google文档加载)时,它似乎只是一遍又一遍地重定向,最终失败。我不确定这是在幕后实际发生了什么,但它是如何出现的。
我们有WebViewClient代码拦截URL并在URL包含" .pdf"时适当地更改/加载它。这是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
我不确定为什么它会一遍又一遍地附加Google Docs网址,但我怀疑这是问题的一部分。我们怀疑该应用程序可能正在尝试使用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
非常感谢任何建议!