Android webview httpsのリンクを読み込みエラーまたは応答なしの解決


最近は無線WiFiを作っていますが、最後の認証に成功した時に広告ページが表示されますので、webviewでロードしました。結果は反応しませんでした。プリントurlが出てきました。https形式です。WebViewを使ってhttpsリソースファイルを読み込む時、証明書をAndroidに承認されないと、対応リソースのロードに成功できない問題があります。この状況に対して対応します。
そこで、Baiduはここに記録して、参考にしてください。
1、WebViewを設定して、すべてのサイトの証明書を受け付けます。
認証証明書がAndroidによって受け入れられない場合、WebView Cleientを書き換えるオン・ReceivedSssslorr方法を設定することにより、すべてのウェブサイトを受け入れる証明書を設定して解決し、WebViewのオンラインReceivedSssleror方法を書き換えることができますが、AppがGooglePlayにアクセスすると警告されます。以下の第二の方法を使用することを提案します。
具体的なコードは以下の通りです。

webView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
handler.proceed();
}
});
注:WebView ClidentのonReceivedSssslorr方法を書き換える際には、必ずOnereceivedSslorr方法のsuper.onReceivedSsslorrを取り除くように注意してください。無効に設定します。
2、mixed contentを有効にする
Android webViewはLollipopからmixedContentModeをデフォルトでは開かないので、オープンすれば私達の大多数の需要を満たすことができます。

webView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webView.getSettings()
.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
});
Android 5.0において、WebViewの面でいくつかの修正がなされました。もしあなたのシステムtarget appiが21以上であれば、
システムデフォルトではmixed contentと第三者クッキーが禁止されています。set MixedContentMode()とsetAcceptThirdPartyCookies()をそれぞれ有効にします。
システムは現在、スマートにHTMLドキュメントのアプリケーションを選択して描画できます。この新しい特性は,メモリのfootprintを低減し,性能を向上させることができる。HTMLドキュメント全体を一括でレンダリングするなら、この方法はenable SlowWholeDcumentDrawを呼び出すことができます。もしあなたのappのtarget appが21以下の場合、システムはmixed contentと第三者クッキーを許可し、いつもHTMLドキュメント全体を一括でレンダリングします。
WebViewを使用するクラスに次のコードを追加します。

// android 5.0       Mixed Content
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 webView.getSettings().setMixedContentMode(
  WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
結果:
私の問題はこれらのところにあるのではなく、Urlをロードする時、一部のUrlはhttpsではなくhttpを使っています。では、バックグラウンドの開発者にhttpをhttpsに変えてください。これで成功しました。あるいは、いくつかの第三方倉庫を使ってもいいです。
テスト:
1、ハイドマップを呼び出すと表示できません。フロントエンドエンジニアはhttpを使いました。それならhttpsに変えます。
2、一部の機能が実現されていません。バックグラウンドの証明書がないので…。では、全部httpに戻ります。
知識を補充します:Android WebViewはホームページのリンクの出会うあれらの坑をロードします。
もともと非常に簡単な問題だと思いましたが、結果的に多くのピットに遭遇しました。今までは問題が起こらないことを保証する勇気がなく、大部分の問題を解決しました。
いくつかの問題を並べてみます。
webviewで他のページにジャンプしても応答がありません。
webviewでファイルをダウンロードしても応答がありません。
リンクの一部が表示されません。
一部のURLを開いてブラウザに自動移動します。
1.webviewで他のページにジャンプしても応答がありません。
修正前のコードは以下の通りです。

 WebSettings webSettings = webView.getSettings();
 //  WebView  ,    Javascript  
 webSettings.setJavaScriptEnabled(true);
 //        
 webSettings.setAllowFileAccess(true);
 //      
 webSettings.setBuiltInZoomControls(true);
 webView.loadUrl(link);

 webView.setWebViewClient(new webViewClient ());
修正後、webviewの設定を多く追加しました。

webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.supportMultipleWindows();
webSettings.setAllowContentAccess(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSavePassword(true);
webSettings.setSaveFormData(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLoadsImagesAutomatically(true);

webView.setWebChromeClient(new WebChromeClient());//        
もちろん、これらの属性は追加しなくてはいけないものがあります。できるだけ多くの需要を満たすために追加しました。
修正したらwebviewで他のurlリンクにジャンプできます。最初の問題を解決したとしても。
2.webviewでファイルをダウンロードしても応答がありません。
自分のwebviewはダウンロード機能がないので、システムを処理したり、ユーザー定義でダウンロードしたりする必要があります。
webviewはダウンロード傍受インターフェースを提供してくれました。以下はダウンロード処理を実現します。

class MyDownLoad implements DownloadListener {
  @Override
  public void onDownloadStart(String url, String userAgent,
         String contentDisposition, String mimetype, long contentLength) {
   if (url.endsWith(".apk")) {
    /**
    *       apk
    */
    Uri uri = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW,uri);
    startActivity(intent);
   }
  }
 }
そして設定に追加します。
webView.set DownloadListener(new MyDown Load);
ここではダウンロード機能をシステムに任せて処理しています。特別な需要がないので、カスタマイズしません。
3.一部のURLのリンクが表示できなくて、エラーを報告しました。net:err_unknown_クルクルscheme
私たちは時々WebView Cientをカスタマイズしましたので、内容は大体次の通りです。

private class webViewClient extends WebViewClient {
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
   view.loadurl(url)//  true     webview   ,  false       
   return super.shouldOverrideUrlLoading(view,url);  }

  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
   if(!dialog.isShowing()) {
    dialog.show();
   }
   super.onPageStarted(view, url, favicon);
  }

  @Override
  public void onPageFinished(WebView view, String url) {
   if(dialog.isShowing()){
    dialog.dismiss();
   }
   super.onPageFinished(view, url);
  }
 }
ShuldOverrideUrlLoading方法に注意してください。普段はview.loadurlを設置するかもしれません。このコードで一部のページが開けられなくなりました。webviewの自分でページをロードするのは制限があるかもしれません。だから私はこの文を抜きにして、帰る時にtrueに戻りました。(trueは現在のwebviewでウェブページを開いています。falseはブラウザでウェブページを開く傾向があります)。このようにして、一部のホームページはまだ開けられないことを発見しました。webView.set WebView Cientを直接削除しましたが、web View.set WebChromeCient(new WebChromeClient)は削除できません。結果、ウェブページは開けましたが、自動的にブラウザに移動する場合もあります。しかし、私たちの需要はブラウザを開けないことです。
4.一部のURLを開いてブラウザに自動的にジャンプします。
上記を受けて、一部のURLを開いてブラウザにジャンプしました。どうやって彼をジャンプさせないのですか?trueに戻ったらジャンプ禁止ですが、一部のウェブサイトはwebviewで開けられません。これからはtrueやfalseに直接戻らないで、superに戻ります。その親の処理をしても、ブラウザに移動していません。ホームページも開きました。とりあえずこのように終わりました。ほとんどのサイトの互換性ができました。
まとめ:私はwebviewに対する理解も限られていますので、深くないのは問題の一部だけです。参考にしていただければと思いますが、どうぞよろしくお願いします。