Android webview-shouldInterceptRequest不是第一次被调用
我有一个非常复杂的错误:在我的应用程序中,我使用webview显示本地图像。在webview的版本“76.0.3809.111”之前,一切都很正常,但在这个版本中,当我试图显示这些图像时,我得到了“加载资源失败:net::ERR_UNKNOWN_URL_SCHEME”。只有在第一次运行时,当我关闭应用程序并重新启动它时,才会发生此错误。一切正常。 另外,当我设置settings.setAppCacheEnabled(false)时,一切都正常工作。 当我调试我的应用程序时,我注意到在第一次(没有加载图像)“shouldInterceptRequest”方法没有调用 这是我的webview设置:Android webview-shouldInterceptRequest不是第一次被调用,android,caching,android-webview,android-websettings,Android,Caching,Android Webview,Android Websettings,我有一个非常复杂的错误:在我的应用程序中,我使用webview显示本地图像。在webview的版本“76.0.3809.111”之前,一切都很正常,但在这个版本中,当我试图显示这些图像时,我得到了“加载资源失败:net::ERR_UNKNOWN_URL_SCHEME”。只有在第一次运行时,当我关闭应用程序并重新启动它时,才会发生此错误。一切正常。 另外,当我设置settings.setAppCacheEnabled(false)时,一切都正常工作。 当我调试我的应用程序时,我注意到在第一次(没有
WebSettings settings = wv.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
wv.addJavascriptInterface(jsHandler, "cpjs");
settings.setDomStorageEnabled(true);
String PACKAGE_NAME = ctx.getPackageName();
settings.setDatabaseEnabled(true);
settings.setDatabasePath("/data/data/" + PACKAGE_NAME + "/databases/");
settings.setAppCacheMaxSize(1024 * 1024 * 16);
settings.setAppCachePath(ctx.getCacheDir().getAbsolutePath());
settings.setAllowFileAccess(true);
settings.setAppCacheEnabled(true);
settings.setLightTouchEnabled(false);
settings.setSupportZoom(false);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//Allow to redirect https to http for downloading content
if (Build.VERSION.SDK_INT >= 21) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
KsLog.i(TAG, "WebView settings, MIXED_CONTENT_ALWAYS_ALLOW set");
}
settings.setSavePassword(false);
settings.setLightTouchEnabled(false);
settings.setSupportZoom(false);
wv.setScrollContainer(false);
wv.setHorizontalScrollBarEnabled(false);
wv.setVerticalScrollBarEnabled(false);
wv.setLongClickable(false);
wv.cancelLongPress();
这是“shoulInterceptRequest”方法的覆盖:
这是一个坏图像的示例:
这是良好形象的一个例子:
感谢大家,我希望我能很好地解释自己。你找到解决方案了吗?我面临着一个非常类似的问题。是的,对我来说,解决方案非常简单,我只是增加了在我的webview上加载URL的延迟。我认为这是因为chrome的新引擎功能更强大,页面在图像下载之前就被加载了。谢谢Gil,这意味着shouldInterceptRequest()一直都在被调用,但就是找不到图像,对吗?确切地说是shouldInterceptRequest()越来越called@gilcohen您到底是如何增加在webview中加载URL的延迟的?你用过处理器吗?我可以要求查看代码吗?谢谢。你找到解决办法了吗?我面临着一个非常类似的问题。是的,对我来说,解决方案非常简单,我只是增加了在我的webview上加载URL的延迟。我认为这是因为chrome的新引擎功能更强大,页面在图像下载之前就被加载了。谢谢Gil,这意味着shouldInterceptRequest()一直都在被调用,但就是找不到图像,对吗?确切地说是shouldInterceptRequest()越来越called@gilcohen您到底是如何增加在webview中加载URL的延迟的?你用过处理器吗?我可以要求查看代码吗?非常感谢。
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
try {
if (url.startsWith(Constants.KS_LOCAL_PREFIX)) {
// In case url starts with our proprietary protocol handle the request.
// Images are located in the external files directory under "images" folder
String fileName = url.substring(url.lastIndexOf(Constants.URL_SLASH));
String filePath = FileUtils.getImagesLocalFolder(getAppContext()) + fileName;
File imagefile = new File(filePath);
FileInputStream fis = new FileInputStream(imagefile);
Bitmap bi = BitmapFactory.decodeStream(fis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (bi != null) {
bi.compress(Bitmap.CompressFormat.PNG, 100, baos);
}
byte[] data = baos.toByteArray();
InputStream is = new ByteArrayInputStream(data);
return new WebResourceResponse("text/html", "UTF-8", is);
}
} catch (FileNotFoundException e) {
KsLog.d(TAG, e.toString());
} catch (NullPointerException nullEx) {
KsLog.d(TAG, nullEx.toString());
}
return super.shouldInterceptRequest(view, url);
}