33

WebViewにWebサイトをロードするAndroidアプリを開発していますが、WebサイトがHTTPコード500を返すことがあります。

私の質問は、リスナーまたは別のクラスを使用してWebViewからHTTPステータスコードを取得する方法はありますか?

WebViewClientを実装しようとしましたが、WebViewが受信したHTTPステータスコードを取得できませんでした。

4

8 に答える 8

18

それは不可能です(私がこれを書いている時点で)。のドキュメントはonReceiveError()せいぜいあいまいですが、この問題を見ると、

http://code.google.com/p/android/issues/detail?id=968

HTTP ステータス コードがそのメカニズムを通じて報告されないことは明らかです。開発者がWebViewHTTP ステータス コードを取得する方法をまったく記述していない可能性があることに、本当に頭がおかしくなりました。

于 2012-08-23T17:14:40.837 に答える
14

ajax を使用してコンテンツをロードし、それを loadDataWithBaseURL を使用して webview に入れることができます。

このようなウェブページを作成します

<script type="text/javascript">
    function loadWithAjax() {
        var httpRequest = new XMLHttpRequest();
        var path = 'PATH';
        var host = 'HOST';
        var url = 'URL';

        httpRequest.onreadystatechange = function(){
            if (httpRequest.readyState === 4) { 
                if (httpRequest.status === 200) {
                    browserObject.onAjaxSuccess(host, url, httpRequest.responseText);
                } else {
                    browserObject.onAjaxError(host, url, httpRequest.status);
                }
            }
        };

        httpRequest.open('GET', path, true);
        httpRequest.send(null);
    }
</script>
<body onload="loadWithAjax()">

browserObjectは、javascript に注入された Java オブジェクトです。

addJavascriptInterface(this, "browserObject");

そしてそれをwebViewにロードします。path/url を値に置き換える必要があります。

ajaxHtml = IOUtils.toString(getContext().getAssets().open("web/ajax.html"));
            ajaxHtml = ajaxHtml.replace("PATH", path);
            ajaxHtml = ajaxHtml.replace("URL", url);
            ajaxHtml = ajaxHtml.replace("HOST", host);

loadDataWithBaseURL(host, ajaxHtmlFinal, "text/html", null, null);

次に、 onAjaxSuccess/onAjaxError を次のように処理します。

    public void onAjaxSuccess(final String host, final String url, final String html)
    {
        ((Activity) getContext()).runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                loadDataWithBaseURL(url, html, "text/html", null, null);
            }
        });
    }

    public void onAjaxError(final String host, final String url, final int errorCode)
    {

    }

これで、http エラーを処理できます。

于 2012-12-21T16:41:50.637 に答える
5

これは、Android M API ( https://code.google.com/p/android/issues/detail?id=82069#c7 )の新しいコールバックを介して可能であるように見えます。

void onReceivedHttpError(WebView ビュー、WebResourceRequest リクエスト、WebResourceResponse errorResponse)

残念ながら、これはおそらく Android M より前のデバイスでは利用できません。

于 2015-07-26T18:24:43.343 に答える
3

実際、HTTP ステータスをチェックして、コンテンツが Web ビューにロードできるかどうかを確認するのはそれほど悪いことではありません。想定: 既に WebView を設定しており、ターゲット URL の文字列を持っている...

    AsyncTask<Void, Void, Void> checkURL = new AsyncTask<Void, Void, Void>() {
        @Override
        protected void onPreExecute() {
            pd = new ProgressDialog(WebActivity.this, R.style.DickeysPDTheme);
            pd.setTitle("");
            pd.setMessage("Loading...");
            pd.setCancelable(false);
            pd.setIndeterminate(true);

            pd.show();
        }
        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            int iHTTPStatus;

            // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpRequest = new HttpGet(sTargetURL);

                HttpResponse httpResponse = httpClient.execute(httpRequest);
                iHTTPStatus = httpResponse.getStatusLine().getStatusCode();
                if( iHTTPStatus != 200) {
                    // Serve a local page instead...
                    wv.loadUrl("file:///android_asset/index.html");
                }
                else {

                    wv.loadUrl(sTargetURL);     // Status = 200 so we can loard our desired URL
                }

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                // Show a toast for now...
                Toast.makeText(WebActivity.this, "UNSUPPORTED ENCODING EXCEPTION", Toast.LENGTH_LONG).show();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                // Show a toast for now...
                Toast.makeText(WebActivity.this, "CLIENT PROTOCOL EXCEPTION", Toast.LENGTH_LONG).show();

            } catch (IOException e) {
                e.printStackTrace();
                // Show a toast for now...
                Toast.makeText(WebActivity.this, "I/O EXCEPTION", Toast.LENGTH_LONG).show();

            }  catch (Exception e) {
                e.printStackTrace();
                // Show a toast for now...
                Toast.makeText(WebActivity.this, "GENERIC EXCEPTION", Toast.LENGTH_LONG).show();

            }

            return null;
        }


    };

    checkURL.execute((Void[])null);

他の場所では、WebViewClient で進行状況ダイアログを閉じます

@Override  
    public void onPageFinished(WebView view, String url)  
    {
        // Do necessary things onPageFinished
        if (pd!=null) {
            pd.dismiss();
        }

    }       
于 2014-02-06T17:16:02.747 に答える
2

現時点では、通常のHTTP応答コードを取得することはできません。

ただし、解決策として、webappサーバー側を変更できる場合は、次を使用します。

サーバー上でJavaScript関数を作成します。たとえば、riseHttpError

Android側ではJavaScriptインターフェースを使用し、Androidにhttpエラーを処理するように指示する必要がある場合はAndroid.riseHttpError()、サーバーを呼び出すだけです。

Androidがこの機能を処理し、Android側で必要なアクションを実行できるようになります。

私のソリューションでは、エラーを取得する必要がありました。必要なコードを送信できます。:)

もちろん、これはそれを行う方法の単なる別のバリ​​エーションです。したがって、おそらく他にも、はるかに優れたソリューションがあります。

しかし、サーバー側を変更できるのであれば、を使用してダブルリクエストを実行する方が良いと思いますURLHandler

于 2012-12-10T19:21:37.773 に答える
1

webView から簡単にステータス コードを取得することはできないと思います (可能な場合)。

私の考えは、WebViewClient で定義されたエラーを使用して WebViewClient の onReceivedError() メソッドを使用することです (エラーの完全なリストはここにあります: http://developer.android.com/reference/android/webkit/WebViewClient.html ) 。たとえば、504 ステータス コードが WebViewClient.ERROR_TIMEOUT などと等しいとします。

于 2012-08-09T19:48:01.613 に答える
-1

ページの終了後にこれを使用する必要があります

@Override 
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
    //Your code to do
    Toast.makeText(
        getActivity(), 
        "Your Internet Connection May not be active Or " + error,
        Toast.LENGTH_LONG
    ).show();
}
于 2016-05-10T17:44:00.177 に答える