WebSettings.setJavaScriptEnabled

WebSettingsのsetJavaScriptEnabledでJavaScriptを有効にできる・・・。

WebSettings | Android Developers

現状、

f:id:BG1:20170304112721p:plain

こんな警告が出ているので、いい加減JavaScriptを有効にする・・・。

MainActivity.javaで、

onCreateで、webView.getSettingsでwebSettingsを取得・・・。
webSettings.setJavaScriptEnabledでtrueにするだけで、JavaScriptが有効になる・・・。

f:id:BG1:20170304113031p:plain

はい消えた・・・。

Sample/android/WebSettings/setJavaScriptEnabled/src/WebSettings at master · bg1bgst333/Sample · GitHub

SslErrorHandler.cancel

onReceivedSslErrorが発生し、ユーザがロードをキャンセルしたい場合は、SslErrorHandler.cancelを使う・・・。

SslErrorHandler | Android Developers

CustomWebViewClient.javaで、

ポジティブボタンの"Proceed"に加えて、ネガティブボタンの"Cancel"も追加・・・。
"Cancel"が押されたら、handler.cancelでロードをキャンセル・・・。

f:id:BG1:20170303164554p:plain

https://bgstation0.comをロード・・・。

f:id:BG1:20170303164657p:plain

2つボタンがあるうち、Cancelを選択・・・。

f:id:BG1:20170303164736p:plain

ロードがキャンセルされて、プログレスバーも消えてる・・・。
エラーページに・・・。

f:id:BG1:20170303164840p:plain

今度はバックキー・・・。

f:id:BG1:20170303164902p:plain

プログレスバーが出たままなので、どうもキャンセルとは違って止まっている模様・・・。

f:id:BG1:20170303164957p:plain

今度はProceedを選択・・・。

f:id:BG1:20170303165014p:plain

今度はロードできた・・・。
しかし、バックキーや、外枠タッチの場合は、どうすればいいのか・・・。悩ましいところ・・・。

Sample/android/SslErrorHandler/cancel/src/SslErrorHandler at master · bg1bgst333/Sample · GitHub

SslErrorHandler.proceed

onReceivedSslErrorで、SSLエラーを拾えるのはわかったが、そのままだとページを表示できない・・・。
ユーザの許可を得て、ロードを薦めるには、SslErrorHandler.proceedを使う・・・。

SslErrorHandler | Android Developers

今回はダイアログを表示し、Proceedボタンを押したら、進めるようにする・・・。

CustomWebViewClient.javaで、

AlertDialog.Builderでアラートダイアログ作成・・・。
"SSL Error!"と表示し、"Proceed"がonClickなら、handler.proceedで進める・・・。
なお、super.onReceivedSslErrorがないので、キャンセルすると止まったままの状態になる・・・。

f:id:BG1:20170303113544p:plain

Yahoo!トップから、

f:id:BG1:20170303113608p:plain

https://bgstation0.comをロード・・・。

f:id:BG1:20170303113643p:plain

"SSL Error!"の確認ダイアログがでる・・・。
バックキーとかダイアログの外をタッチするとキャンセルになり、

f:id:BG1:20170303113744p:plain

ロードはされない・・・。というかロードが止まった状態なのか・・・。

f:id:BG1:20170303113832p:plain

もう一回ロード・・・。
今度はProceedを押すと、

f:id:BG1:20170303113858p:plain

ロードされる・・・。

Sample/android/SslErrorHandler/proceed/src/SslErrorHandler at master · bg1bgst333/Sample · GitHub

WebSettings

WebSettingsは、WebViewのさまざまな設定を持つクラス・・・。

WebSettings | Android Developers

とりあえずユーザエージェントを取得してみる・・・。

onPageFinishedで、view.getSettingsでwebSettingsを取得・・・。
webSettings.getUserAgentStringでユーザエージェント文字列を取得し、Toastで表示・・・。

f:id:BG1:20170302150637p:plain

表示された・・・。

Sample/android/WebSettings/WebSettings/src/WebSettings at master · bg1bgst333/Sample · GitHub

WebViewClient.onReceivedSslError

onReceivedSslErrorは、SSLエラーが発生した時のハンドラ・・・。

WebViewClient | Android Developers

SSLエラーは普通のエラーと違って、こちらに来るらしい・・・。

CustomWebViewClient.javaで、

	// エラーが発生した時.
	@Override
	public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
		
		// エラーコードと説明の表示.
		Toast.makeText(context, Integer.toString(errorCode) + ":" + description, Toast.LENGTH_LONG).show();	// ToastでerrorCodeとdescriptionを表示.
		
	}

onReceivedErrorはToastだけにした・・・。
error.htmlもいらないので削除・・・。

で、

	// SSLエラーが発生した時.
	@Override
	public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
		
		// SSLエラーのエラーメッセージを表示.
		Toast.makeText(context, "SSL Error!", Toast.LENGTH_LONG).show();	// Toastで"SSL Error!"を表示.
		
	}

onReceivedSslErrorに来たときは、トーストで"SSL Error!"と表示するようにした・・・。

で、これのテストのために、

オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている

ここを参考にSSLオレオレ証明書つくったり・・・。

f:id:BG1:20170302122012p:plain

まずは普通にアクセス・・・。

f:id:BG1:20170302122206p:plain

表示できる・・・。

f:id:BG1:20170302122253p:plain

0を消してロードしてみると、

f:id:BG1:20170302122407p:plain

前回の様にloadUrlしなければこうなる・・・。

f:id:BG1:20170302122447p:plain

0をつけて、httpsにしてロードすると、

f:id:BG1:20170302122538p:plain

"SSL Error!"が出るのはいいのだが、ロードが止まってしまって動かない・・・。(ように見えるのかもしれないけど・・・。)

なので、

親クラスに任せるようにすると、

f:id:BG1:20170302122954p:plain

ロードが完了する・・・。
で、結局エラーページが表示されているのだが、この辺は端末で違う・・・。(真っ白になる場合もある・・・。)

Sample/android/WebViewClient/onReceivedSslError/src/WebViewClient at master · bg1bgst333/Sample · GitHub

WebViewClient.onReceivedError

onReceivedErrorは、エラーが発生した時のハンドラ・・・。

WebViewClient | Android Developers

エラーが発生した時には、エラーページへ遷移し、トーストでエラーコードと説明を表示してみる・・・。

assetsフォルダの下にerror.htmlというファイルを作成し、

適当なエラーページを作る・・・。

CustomWebViewClient.javaで、

onReceivedErrorに来たら、loadUrlでerror.htmlをロード・・・。
そのあとToastで、引数のerrorCodeをInteger.toStringで変換したものと、descriptionを合わせて表示・・・。

f:id:BG1:20170301133703p:plain

"bgstation0"でロードすると、

f:id:BG1:20170301133736p:plain

ロードできるが、

f:id:BG1:20170301133755p:plain

"bgstation"でロードすると、

f:id:BG1:20170301133821p:plain

ローカルのerror.htmlに遷移して、トーストでエラーの内容も表示される・・・。
(とはいえ、errorCodeはHTTPエラーコードではない模様・・・。)

Sample/android/WebViewClient/onReceivedError/src/WebViewClient at master · bg1bgst333/Sample · GitHub

WebChromeClient.onProgressChanged

onProgressChangedは、ロードの進捗の変化があった時に発生するハンドラ・・・。

WebChromeClient | Android Developers

今回はプログレスバーで進捗を表示する・・・。

activity_main.xmlに、

ProgressBarを追加・・・。

CustomWebViewClient.javaで、

コンストラクタで、progressBarを取得して、最大値100、進捗を0、非表示の状態に・・・。

ロード開始で進捗を0にセットして表示・・・。

完了したら100で非表示に・・・。

CustomWebChromeClient.javaでは、

こっちでも取得しておいて、

onProgressChangedに来るたびにnewProgressをprogressBar.setProgressでプログレスバーにセットする・・・。

f:id:BG1:20170301112500p:plain

ロードしてないとこうだが、

f:id:BG1:20170301112517p:plain

ロード中はプログレスバーが進んでいく・・・。

Sample/android/WebChromeClient/onProgressChanged/src/WebChromeClient at master · bg1bgst333/Sample · GitHub