HTML5 ハイブリッドアプリでは、サードパーティのウェブサイト(例:百度)を H5 ページで開く必要がありますが、Android ではデフォルトで現在の WebView ではなく、システムや外部ブラウザを呼び出します。解決策は、WebViewClient を独自にオーバーライドし、shouldOverrideUrlLoading をオーバーライドして True を返すことです。
実装コード
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
// WebView が URL をロードし、システムが URL を処理する必要がないことを通知する
view.loadUrl(url);
return true;
}
});
この理由は、Android のソースコードからわかります。True は、ホストアプリケーションが現在の WebView を離れて URL を自身で処理することを希望する場合であり、それ以外の場合は false を返します。
/** 現在の WebView に新しい URL がロードされる直前に、ホストアプリケーションに制御を引き渡す機会を与えます。
* WebViewClient が提供されていない場合、デフォルトでは WebView は Activity Manager に url の適切なハンドラを選択するように要求します。
* WebViewClient が提供されている場合、true を返すと、ホストアプリケーションが url を処理し、false を返すと、現在の WebView が url を処理します。
* このメソッドは、POST "method" を使用するリクエストには呼び出されません。
@param view コールバックを開始する WebView。
@param url ロードする URL。
@return ホストアプリケーションが現在の WebView を離れて URL を自身で処理する場合は true、それ以外の場合は false。
*/
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
注意点として、コードに電話をかける(tel:)やメールを送信する(mailto:)場合は、URL を簡単にフィルタリングする必要があります。