WebViewにWebサイトをロードするAndroidアプリを開発していますが、WebサイトがHTTPコード500を返すことがあります。
私の質問は、リスナーまたは別のクラスを使用してWebViewからHTTPステータスコードを取得する方法はありますか?
WebViewClientを実装しようとしましたが、WebViewが受信したHTTPステータスコードを取得できませんでした。
WebViewにWebサイトをロードするAndroidアプリを開発していますが、WebサイトがHTTPコード500を返すことがあります。
私の質問は、リスナーまたは別のクラスを使用してWebViewからHTTPステータスコードを取得する方法はありますか?
WebViewClientを実装しようとしましたが、WebViewが受信したHTTPステータスコードを取得できませんでした。
それは不可能です(私がこれを書いている時点で)。のドキュメントはonReceiveError()
せいぜいあいまいですが、この問題を見ると、
HTTP ステータス コードがそのメカニズムを通じて報告されないことは明らかです。開発者がWebView
HTTP ステータス コードを取得する方法をまったく記述していない可能性があることに、本当に頭がおかしくなりました。
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 エラーを処理できます。
これは、Android M API ( https://code.google.com/p/android/issues/detail?id=82069#c7 )の新しいコールバックを介して可能であるように見えます。
void onReceivedHttpError(WebView ビュー、WebResourceRequest リクエスト、WebResourceResponse errorResponse)
残念ながら、これはおそらく Android M より前のデバイスでは利用できません。
実際、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();
}
}
現時点では、通常のHTTP応答コードを取得することはできません。
ただし、解決策として、webappサーバー側を変更できる場合は、次を使用します。
サーバー上でJavaScript関数を作成します。たとえば、riseHttpError
。
Android側ではJavaScriptインターフェースを使用し、Androidにhttpエラーを処理するように指示する必要がある場合はAndroid.riseHttpError()
、サーバーを呼び出すだけです。
Androidがこの機能を処理し、Android側で必要なアクションを実行できるようになります。
私のソリューションでは、エラーを取得する必要がありました。必要なコードを送信できます。:)
もちろん、これはそれを行う方法の単なる別のバリエーションです。したがって、おそらく他にも、はるかに優れたソリューションがあります。
しかし、サーバー側を変更できるのであれば、を使用してダブルリクエストを実行する方が良いと思いますURLHandler
。
webView から簡単にステータス コードを取得することはできないと思います (可能な場合)。
私の考えは、WebViewClient で定義されたエラーを使用して WebViewClient の onReceivedError() メソッドを使用することです (エラーの完全なリストはここにあります: http://developer.android.com/reference/android/webkit/WebViewClient.html ) 。たとえば、504 ステータス コードが WebViewClient.ERROR_TIMEOUT などと等しいとします。
ページの終了後にこれを使用する必要があります
@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();
}