4

私は、WebView からの HTTP トラフィックを傍受し、追加のヘッダーをリクエストに添付してから、戻り値を取得して WebView に表示することに関心があるプロジェクトに取り組んでいます。

このために、webview が表示するはずの WebResourceResponse を返す shouldInterceptRequest(WebView view, String URL) メソッドを使用します。

これが私がすることです:

private WebResourceResponse handleRequest(String url){
    Log.d(TAG, "Intercepting request at : " + url);
    HttpURLConnection connection = null;        
    URL serverAddress = null;           
    WebResourceResponse response = null;
    InputStream is = null;
    String type = null;
    String encoding = null;
    int statusCode;
    int length;

    try
    {
        //Set up the initial connection
        serverAddress = new URL(url);
        connection = (HttpURLConnection)serverAddress.openConnection();

        // Initiate a HEAD request to get meta data
        connection.setRequestMethod("HEAD");

        // Let the WebView handle requests with no headers in them.
        Map<String, List<String>> headers = connection.getHeaderFields();
        if(headers == null){
            Log.d(TAG, "Retrieved response with zero headers at: " + url);
            return null;
        }

        statusCode = connection.getResponseCode();

        if(statusCode == 200){
            // OK, delegate request if content length is large enough
            type = connection.getContentType();
            encoding = connection.getContentEncoding();
            length = connection.getContentLength();

            Log.d(TAG, "ContentType = " + type + " encoding = " + encoding + " " + url);

           connection.disconnect();

            if(length > SIZE_THRESHOLD){
                // send to other device

                Log.d(TAG, "Delegating request to other device NOT IMPLEMENTED");
                // TODO: Currently just handling them locally.
            }
            else{
                connection = (HttpURLConnection)serverAddress.openConnection();
                connection.setRequestMethod("GET");             
                is = connection.getInputStream();
                statusCode = connection.getResponseCode();
                type = connection.getContentType();
                encoding = connection.getContentEncoding();

                Log.d(TAG, "Done Loading " + url);

                return new WebResourceResponse(type, encoding, is);
            }

        }
    } 
    catch (MalformedURLException e) {
            e.printStackTrace();
    }
    catch (ProtocolException e) {
            e.printStackTrace();
    } 
    catch (IOException e) {
        Log.d(TAG, "IOException when connection to : " + url + " Stacktrace: " + Log.getStackTraceString(e));
    }
    return response;
}   

「www.madopskrifter.nu」や「www.newz.dk」などのページを読み込もうとすると、画像とすべてが表示されたコンテンツ全体がうまく表示されます。ただし、stackoverflow のようなページを参照すると、stackoverflow.com で HTML インデックス ファイルを取得するだけです。youtube.com も同様です。(WebView 設定で JavaScript を有効にしています)

足りないものはありますか?現時点では、独自のヘッダーなどを追加することさえしていません。「手動で」取得していることを除いて、同じ応答を単純に返しています。(また、現在、ヘッダーがゼロのリクエストを処理していませんが、そのコードをコメントアウトしても、問題はまだ存在します)。

どんな助けでも大歓迎です、

4

1 に答える 1