2015-08-28 137 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; 
}