2013-07-29 26 views
4

這似乎是一個奇怪的問題,但我很想知道它是否會工作。我正在從事POC工作,因此不得不證明或反駁這是否有效。從Android本機應用程序訪問JS代碼

在Android應用程序中的用戶界面將是原生的(Java + XML佈局)+一些其他設備功能訪問像(相機/文件系統等)。

有一個JS庫,我已經建立,有幾個功能,做Ajax發佈和獲取請求。

在應用程序中,我有一個無形的Webview,我加載一個空白的HTML(引用這個JS庫)。進入該WebView,我注入了JavascripInterface。所以,基本上,用戶界面將是本地的,你永遠不會看到Webview。這只是一個提供對我的JS庫訪問本地代碼的主機。

現在,在我的UI上的一些操作中,我調用了Webview上的JS函數,它反過來嘗試進行ajax調用(loadUrl調用ex。javascipt:functionName())。但是,這些調用失敗,沒有任何明顯的錯誤。

注意:如果我在我的桌面瀏覽器上加載它,這個相同的HTML文件的工作。 AJAX調用成功。

但是,當我發起阿賈克斯通過JavascriptInterface(或webview.loadUrl()調用)調用,他們失敗了,有效應初探狀態除了0

事情從AJAX,喜歡簡單的函數調用,警報和通過javascript界面​​回調工作正常。

問:我知道這是一種奇怪而不切實際的做事方式。但是,它會/應該工作

更新:即使設置了

setBlockNetworkLoads(false)
,它仍然不起作用。

我試着記錄JS調用和錯誤,並得到這個錯誤。

請求標頭字段X-Requested-With不允許通過 訪問控制允許標題。

任何想法如何解決這個問題?

+0

1.你有權限中有'android.permission.INTERNET'嗎? 2.粘貼一個鏈接到你正在請求的頁面或者.html文件的開頭,或者在WebView中加載的東西。 3.您是否在使用:http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest%28android.webkit.WebView,%20java.lang.String%29 – g00dy

+0

可能是一個線程問題 - 問題在UI線程(視圖)和用於ajax請求的線程之間 – uriz

+0

我有權限。爲什麼我需要在這裏使用WebViewClient? –

回答

1

看來你正在嘗試做一個跨域ajax請求。

同一來源策略不允許跨域請求,因此請求將被阻止。如果你正在webView中加載一個本地文件,然後從它發送一個jax請求到其他域,這將是這種情況。

如果是這種情況,並且它是導致麻煩的相同原始策略,那麼您可能需要查看跨源資源共享(CORS)或JSONP來解決此問題。

由於你的錯誤似乎是你的問題類似於一個在這裏討論: Cross-Domain AJAX doesn't send X-Requested-With header

您可能希望更改服務器的設置,讓X-要求,隨着頭。

此外,似乎從API級別16,webSettings添加了一個方法setAllowFileAccessFromFileURLs()。爲webView設置爲true也可以解決問題。

+0

CORS或JSONP是否也適用於POST請求?我想我讀了JSONP不能用於POST的地方 –

+0

看起來像一個CORS問題。目前,我沒有辦法修復服務器端來檢查這個。但是,我已經在瀏覽器端調試了Javascript控制檯,還有服務器日誌。 –

0

我有一個類似的問題,我在本地加載一個「網絡應用」到WebView,只是遠程做Ajax。我觀察到類似的問題,其中Javascript提醒等工作正常,但AJAX調用沒有。原來,默認WebView"network loads"

確保你這樣做:

webView.getSettings().setBlockNetworkLoads(false);

這爲我做。只是爲了澄清,我沒有使用Javascript接口 - 只是使用webView.loadDataWithBaseUrl()加載web應用程序 - 傳遞給此方法的baseUrl參數是我執行所有AJAX調用的地方(因爲此方法遵守相同的原始策略)

+0

文檔說,如果您具有INTERNET權限,則默認值爲false。我有INTERNET許可。仍然是同樣的結果。這裏需要使用什麼作爲baseURL? –

+0

我有INTERNET權限,如果是IIRC,值仍然是「真」。爲什麼不在日誌語句中打印'getBlockNetworkLoads()'的值並找出?關於baseUrl - 這應該是您的AJAX請求所在的域或IP地址。您在AJAX請求中使用的相對路徑將附加到baseUrl以形成完整的URL。您的AJAX調用將僅限於此域 - 您將無法對其他域進行AJAX調用(這符合相同的原產地策略) – curioustechizen

+0

對於我的請求,我確實發佈了請求,並且只有一個URL。沒有網址路徑。 –

相關問題