66

アプリケーションにWebViewがあり、そのサイトでいくつかのサイトが開かれています(常に同じですが、それは自分のページです)。このサイトには、リモートホストからいくつかの画像をロードするJSコードがあります。

そのような画像へのリクエストを(URLパターンで)インターセプトして自分のコンテンツ(つまり別の画像)を返すか、内部アプリケーションロジックに応じてリクエストをそのままにしておきたいです。

それは可能ですか?

編集:質問の現在の状態...

WebViewWebViewClient(Axarydaxによって指摘されているように)を設定する機能があります。WebViewClient2つの便利な方法があります

  • shouldOverrideUrlLoading
  • onLoadResource

shouldOverrideUrlLoading読み込みがページの相互作用によってトリガーされる場合(つまり、ページ上のリンクがクリックされた場合、WebView.loadURL( "")はこのメソッドをトリガーしません)、URLの読み込みをインターセプトできます。falseを返すことでURLの読み込みをキャンセルすることもできます。このアプローチは使用できません。なぜなら、ページリソースの読み込みを傍受することができないからです(そして、私が傍受する必要があるのは、そのようなページリソースです)。

onLoadResourceそのページリソース(および画像!Jessyjonesへのthx)が読み込まれるたびにトリガーされますが、それをキャンセルする方法はありません。そのため、この方法は私のタスクにも適していません。

4

7 に答える 7

72

これを試してみてください、私は個人用ウィキのようなアプリでそれを使用しました:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("foo://")) {
            // magic
            return true;
        }
        return false;
    }
});
于 2011-01-26T13:23:19.750 に答える
55

APIレベル11は必要なものをサポートしているようです。を参照してくださいWebViewClient.shouldInterceptRequest()

于 2011-03-03T14:16:11.493 に答える
11

私の知る限り、shouldOverrideUrlLoadingは画像ではなく、ハイパーリンクに対して呼び出されます...適切な方法は次のとおりです。

@Override public void onLoadResource(WebView view, String url)

このメソッドは、Webビューによってロードされるすべてのリソース(画像、スタイルシート、スクリプト)に対して呼び出されますが、無効であるため、そのURLを変更して、ローカルリソースをロードするように置き換える方法が見つかりませんでした...

于 2011-01-26T15:59:20.380 に答える
9

これが私のアプリに使用するソリューションです。

css / js /imganfフォントファイルを含むアセットフォルダーがいくつかあります。

アプリケーションはすべてのファイル名を取得し、この名前のファイルが要求されているかどうかを確認します。はいの場合、アセットフォルダからロードします。

//get list of files of specific asset folder
        private ArrayList listAssetFiles(String path) {

            List myArrayList = new ArrayList();
            String [] list;
            try {
                list = getAssets().list(path);
                for(String f1 : list){
                    myArrayList.add(f1);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return (ArrayList) myArrayList;
        }

        //get mime type by url
        public String getMimeType(String url) {
            String type = null;
            String extension = MimeTypeMap.getFileExtensionFromUrl(url);
            if (extension != null) {
                if (extension.equals("js")) {
                    return "text/javascript";
                }
                else if (extension.equals("woff")) {
                    return "application/font-woff";
                }
                else if (extension.equals("woff2")) {
                    return "application/font-woff2";
                }
                else if (extension.equals("ttf")) {
                    return "application/x-font-ttf";
                }
                else if (extension.equals("eot")) {
                    return "application/vnd.ms-fontobject";
                }
                else if (extension.equals("svg")) {
                    return "image/svg+xml";
                }
                type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
            }
            return type;
        }

        //return webresourceresponse
        public WebResourceResponse loadFilesFromAssetFolder (String folder, String url) {
            List myArrayList = listAssetFiles(folder);
            for (Object str : myArrayList) {
                if (url.contains((CharSequence) str)) {
                    try {
                        Log.i(TAG2, "File:" + str);
                        Log.i(TAG2, "MIME:" + getMimeType(url));
                        return new WebResourceResponse(getMimeType(url), "UTF-8", getAssets().open(String.valueOf(folder+"/" + str)));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        //@TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @SuppressLint("NewApi")
        @Override
        public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
            //Log.i(TAG2, "SHOULD OVERRIDE INIT");
            //String url = webResourceRequest.getUrl().toString();
            String extension = MimeTypeMap.getFileExtensionFromUrl(url);
            //I have some folders for files with the same extension
            if (extension.equals("css") || extension.equals("js") || extension.equals("img")) {
                return loadFilesFromAssetFolder(extension, url);
            }
            //more possible extensions for font folder
            if (extension.equals("woff") || extension.equals("woff2") || extension.equals("ttf") || extension.equals("svg") || extension.equals("eot")) {
                return loadFilesFromAssetFolder("font", url);
            }

            return null;
        }
于 2016-01-27T00:17:09.073 に答える
4

APIバージョンについては言及していませんが、API 11以降、メソッドWebViewClient.shouldInterceptRequestがあります。

多分これは役立つかもしれませんか?

于 2012-08-08T12:36:22.737 に答える
3

究極の解決策は、ループバックで「シークレット」ポートをリッスンする単純なhttpサーバーを埋め込むことです。次に、一致した画像のsrc URLをhttp:// localhost:123/.../mypic.jpgのようなものに置き換えることができます。

于 2011-09-30T20:19:13.883 に答える
3

これは役立つかもしれません:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
    String url = request.getUrl().toString();
    WebResourceResponse response = super.shouldInterceptRequest(view, request);
    // load native js
    if (url != null && url.contains(INJECTION_TOKEN/* scheme define */)) {

        response = new WebResourceResponse(
                "text/javascript",
                "utf-8",
                loadJsInputStream(url, JsCache.getJsFilePath(path) /* InputStream */));
    }
    return response;
}
于 2016-03-25T06:00:49.510 に答える