2017-03-22 66 views
1

我的項目中包含一個庫,該庫包含資產目錄中的一些資產。 在Android 7上運行應用程序時,它運行良好,webview加載資產的情況良好。今天我已經測試了Kitkat(API 19)上的應用程序,並且加載的資源如file://android_asset/someAsset.png未加載。無法在Android上的WebView中訪問資產KitKat

我檢查了爲我的庫創建的aar文件,它包含這些文件[顯然,因爲APK在Android 7上工作正常]。

這裏是我的網絡設置:

WebSettings s = getSettings(); 
    s.setAllowFileAccess(true); 
    s.setSupportZoom(false); 
    s.setBuiltInZoomControls(false); 
    s.setDomStorageEnabled(true); 
    s.setJavaScriptCanOpenWindowsAutomatically(true); 
    s.setUseWideViewPort(true); 
    s.setLoadWithOverviewMode(true); 

    s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); 
    s.setJavaScriptEnabled(true); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     s.setMediaPlaybackRequiresUserGesture(false); 
    } 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
     s.setAllowFileAccessFromFileURLs(true); 
     s.setAllowUniversalAccessFromFileURLs(true); 

    } 
    s.setGeolocationEnabled(false); 

我得到的調試時,Chrome是錯誤:File not found

我讀過一些SO上發佈的問題,這些問題涉及到IntelliJ設置:"Include assets from dependencies into APK"這在Android Studio中不再存在。然而,我發現這個文檔頁面:https://developer.android.com/studio/projects/android-library.html這表明,在添加

dependencies { 
    compile project(':myLib') 
} 

足以提供資產主體工程[和顯然不行,因此AAR內容。

不過,我無法獲得這些資源顯示。

我也嘗試將資產目錄從庫複製到主項目,但仍然沒有運氣。他們不是由webview加載,我得到相同的錯誤。

+0

試試'file:///',而不是'file://'。我一直從資產加載內容到'WebView'沒有問題。參見[我的書](https://commonsware.com/Android)[教程#12](https://github.com/commonsguy/cw-omnibus/tree/master/EmPubLite-AndroidStudio/T12-Book/EmPubLite) ), 例如。 – CommonsWare

回答

0

我要回答我自己的問題,因爲不管愚蠢的問題是誰知道,也許有人會偶然發現類似的問題。

我使用shouldInterceptRequest方法WebViewClient加載文件WebView,因爲所有的內容都是加密的,我必須先解密它。

棒棒糖開始,該方法具有不同的簽名:

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) 

,而不是

public WebResourceResponse shouldInterceptRequest(final WebView view, String url) 

既然我已經寫了使用新的設備我的代碼,我只是有:

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { ... } 

它工作得很好。在舊設備上進行測試時,該方法根本沒有被觸發,並且也找不到它所期望的文件。

在我添加了對這種方法的支持之後,它全部開始工作。

感謝@CommonsWare的評論。