2017-03-22 63 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的评论。