2013-11-15 225 views
19

我有一個使用WebViews的應用程序。我已將目標API從18改爲19,並且正在測試新的4.4。出於某種原因,我得到這個錯誤:Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png在4.4但不是4.3,有人知道爲什麼?奇巧殺人:不允許加載本地資源:file:///android_asset/webkit/android-weberror.png

由於我真的不知道從哪裏開始尋找,我無法給出完整的代碼。這可能與WebViewClient中的shouldInterceptRequest(Webview, String)方法有關,但我不太確定。如果我知道更多,我會更新這個問題。

+0

你是如何加載初始頁面?它來自服務器還是APK中的HTML文件? –

+0

你好@dumazy!你有沒有找到解決辦法? – rahulritesh

+0

@rahulritesh不是真的,它與shouldInterceptRequest有關,但我沒有找到正確的解決方案,所以我決定採取另一種方法... – dumazy

回答

8

「不允許加載本地資源」是一個安全原因錯誤。 KitKat WebView具有更強的安全限制,看起來像是在踢。FWIW我試着只加載一個文件:/// android_asset URL,它工作正常。

你有沒有可能調用任何與文件相關的WebSettings API(如setAllowFileAccess(false))?您是否嘗試從https:URL加載資源?

+1

如何從kitkat中的sdcard加載本地html文件? – user

+0

@ marcin.kosiba https的解決方案是什麼?謝謝。 –

+1

@AdamSilver - 使用shouldInterceptRequest在https:// URL上託管您的本地資源。 –

16

我發現我在使用webview.loadData()時在KitKat上遇到了這個問題。如果我改用webview.loadDataWithBaseURL()(我用「file:/// android_asset /」作爲baseURL),那麼問題就消失了。

方法setAllowFileAccess(),setAllowFileAccessFromFileURLs()setAllowUniversalAccessFromFileURLs()沒有任何影響,我可以看到。

+0

在[docs](http://developer.android.com/reference/android/webkit/WebSettings.html#setAllowUniversalAccessFromFileURLs(boolean))中的那些'allow ...'方法的底部有一個註釋,它說: >請注意,此設置僅影響對文件系統資源的JavaScript訪問。其他對這些資源的訪問(例如,來自圖像HTML元素)不受影響。 問題是如何*做*你影響HTML元素!? –

+0

謝謝! loadDataWithBaseURL()還幫助我通過自定義內容提供者(「content://myapp.something.localfiles/.../video.mp4」)播放本地視頻,該視頻僅使用loadData() – Richard

+0

就停止在KitKat上工作了!它像一個魅力。當我願意將一些靜態js/css文件加載到我的webview中時,我得到了這個問題,用這種方式解決了。謝謝! –

18

有點侵入性的黑客,但我通過引入一個「獨特的令牌」並執行WebViewClient和覆蓋shouldInterceptRequest工作解決此問題。

首先,改變從file:///android/asset URL以相對路徑具有唯一地標識令牌:

<script src="**injection**www/scripts.js"></script> 

然後,重寫shouldInterceptRequest如下:

// Injection token as specified in HTML source 
private static final String INJECTION_TOKEN = "**injection**"; 

webView.setWebViewClient(new WebViewClient() { 

    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) { 
     WebResourceResponse response = super.shouldInterceptRequest(view, url); 
     if(url != null && url.contains(INJECTION_TOKEN)) { 
      String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length()); 
      try { 
       response = new WebResourceResponse(
         "application/javascript", 
         "UTF8", 
         getContext().getAssets().open(assetPath) 
       ); 
      } catch (IOException e) { 
       e.printStackTrace(); // Failed to load asset file 
      } 
     } 
     return response; 
    } 
}); 

這可能降低web視圖性能稍微,因爲我們正在調用每個試圖加載的資源上的,但這是我發現這個問題的唯一解決方法。

+1

我做了類似的事情,希望得到更好的解決方案,但這似乎是最好的解決方法。在我的情況下,我有一個自定義內容提供程序在我的webview上顯示圖像。它曾經完美地工作,直到KitKat,所以我不得不做類似的截取請求,並與圖像的輸入流創建一個響應。 – Pnikosis

+1

這應該是被接受的答案。 – cctan

+0

有沒有一種方法可以應用到iOS> Objective C的代碼? – mdbxz

5

這裏是解決方案:當您嘗試從庫項目加載文件時會發生此問題。如果您的應用程序依賴於webview和html文件所在的庫,那麼您需要在編譯時將該庫項目的資源包含到主應用程序項目中。例如,IntelliJ有一個選項可以做到這一點。在編譯器設置「將資源從依賴項包括到APK中」中,但確保您的資產文件應該具有與主應用程序不同的名稱。您不希望圖書館項目的index.html被主應用程序覆蓋。

+1

這確實是正確的解決方案! – DiscDev

1

它可能需要

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

添加權限清單。

此權限在API級別19開始執行。

+0

這解決了我的問題 - 與OP不同,我試圖從SD卡加載html文件,並得到錯誤「不允許加載本地資源:file:/// android_asset/webkit/android-weberror。png「」 – elliptic1

1

以下解決方案適用於我。

webview.loadDataWithBaseURL(baseUrl, htmlStr, "text/html", "UTF-8", ""); 

baseUrl哪裏是你的外部域,而不是文件:/// android_asset /(即http://a.domain.com)。

+0

謝謝你這個方法適合我(Android 5.1.1) – Dmitry

0

我發現在這個環節上一個不錯的解決方法:http://trentmilton.com/android-webview.html

解決方案的總結是這樣的:

WebView webView = new WebView(this); // this is the context 
webView.getSettings().setDomStorageEnabled(true); 

希望幫助

-2

我有同樣的問題時,我忘了打開我的WiFi,所以你可能只需要確保你有一個互聯網連接。

+0

真的嗎?你認爲這是一個答案? – VSG24

1

不可用的時候,現在這個工作(雖然它不推薦):

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 

下面介紹一下醫生說大約setMixedContentMode:

Configures the WebView's behavior when a secure origin attempts to load a resource from an insecure origin. By default, apps that target KITKAT or below default to MIXED_CONTENT_ALWAYS_ALLOW. Apps targeting LOLLIPOP default to MIXED_CONTENT_NEVER_ALLOW. The preferred and most secure mode of operation for the WebView is MIXED_CONTENT_NEVER_ALLOW and use of MIXED_CONTENT_ALWAYS_ALLOW is strongly discouraged.

然而,這可能不是回答原來的題;它看起來像只限於棒棒糖開始的限制。

相關問題