Android WebView - 使用 Google Docs 打开 PDF 的重定向问题

标签 android pdf google-docs

我有一个奇怪的问题,似乎只发生在少数物理设备(Nexus 4、Nexus 7)上,所有设备都运行最新的 Android 操作系统。我无法在我的旧 LG 测试手机上重现它,也无法在我使用的任何 Genymotion 模拟器中重现它;我已经尝试了各种 API 级别和各种模拟器设备,但它从未在模拟器中发生过。

问题是,当调用 PDF 网址(使用 Google 文档加载它)时,它似乎只是一遍又一遍地重定向,最终失败。我不确定这是否就是幕后实际发生的事情,但它看起来就是这样。

如果 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

我不确定为什么它一遍又一遍地附加 Google 文档 URL,但我怀疑这是问题的一部分。我们怀疑该应用程序可能也在尝试使用 Google Drive 或其他工具打开它,但我们并非 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

如有任何建议,我们将不胜感激!

最佳答案

我们找到了一个解决方案,虽然不是很优雅。我们仍然不知道根本原因,但添加下面的代码可确保它不会多次将“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;
}

关于Android WebView - 使用 Google Docs 打开 PDF 的重定向问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279973/

相关文章:

php - 从PHP脚本exec()执行时,无法从gradle中获取输出

java - 多个 TextView 具有一个 ID

javascript - 如何根据滚动找到DIV的id?

javascript - Puppeteer 生成的 PDF 复制/粘贴文本会产生奇怪的字符

javascript - 如何从 nodejs 中从 Google 文档导出的 docx 中提取元作者和标题?

curl:谷歌电子表格为 .csv

caching - 将文档重新加载到 Google 文档查看器(清除缓存)

java - 如何获取所有 NFC 类型的事件?

java - 从后台 worker 更新 UI

pdf - 如何在 JasperReports 中压缩 PDF