Android-веб-просмотр - firstInterceptRequest не вызывается в первый раз - PullRequest
0 голосов
/ 22 сентября 2019

У меня очень сложная ошибка: в моем приложении я использую в веб-представлении отображение локальных изображений.до версии ' 76.0.3809.111 ' веб-обзора все работало идеально, но с этой версии, когда я пытаюсь отобразить эти изображения, я получаю сообщение «Не удалось загрузить ресурс: net :: ERR_UNKNOWN_URL_SCHEME».Эта ошибка возникает только при первом запуске, когда я закрываю приложение и перезагружаю его, все работает нормально.Кроме того, когда я устанавливаю settings.setAppCacheEnabled (false), также все работает отлично.Когда я отлаживал свое приложение, я заметил, что в первый раз (когда изображения не загружены) не должны вызываться методы shouldInterceptRequest.

это мои настройки веб-просмотра:

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

и это переопределение метода shouldInterceptRequest:

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

Это пример плохогоimage: enter image description here

Это пример хорошего изображения: **enter image description here**

Спасибо всем, и я надеюсь, что я все хорошо объяснил.

...