Android webview-shouldInterceptRequest不是第一次被调用

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)时,一切都正常工作。 当我调试我的应用程序时,我注意到在第一次(没有

我有一个非常复杂的错误:在我的应用程序中,我使用webview显示本地图像。在webview的版本“76.0.3809.111”之前,一切都很正常,但在这个版本中,当我试图显示这些图像时,我得到了“加载资源失败:net::ERR_UNKNOWN_URL_SCHEME”。只有在第一次运行时,当我关闭应用程序并重新启动它时,才会发生此错误。一切正常。 另外,当我设置settings.setAppCacheEnabled(false)时,一切都正常工作。 当我调试我的应用程序时,我注意到在第一次(没有加载图像)“shouldInterceptRequest”方法没有调用

这是我的webview设置:

    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);
        }