新しい WebView は、リソースを要求し、カスタム URL スキームを使用するリンクを解決するときに、追加の制限を適用します。たとえば、shouldOverrideUrlLoading() や shouldInterceptRequest() などのコールバックを実装すると、WebView は有効な URL に対してのみコールバックを呼び出します。
カスタム URL スキームまたはベース URL を使用していて、Android 4.4 でアプリがこれらのコールバックの呼び出しをあまり受けていない、またはリソースの読み込みに失敗していることに気付いた場合は、RFC 3986 に準拠した有効な URL がリクエストで指定されていることを確認してください。
たとえば、新しい WebView は、次のようなリンクに対して shouldOverrideUrlLoading() メソッドを呼び出さない場合があります。
プロファイルを表示 ユーザーがこのようなリンクをクリックした結果は、次のように異なる場合があります。
無効または null のベース URL を指定して loadData() または loadDataWithBaseURL() を呼び出してページをロードした場合、ページ上のこのタイプのリンクに対する shouldOverrideUrlLoading() コールバックを受け取りません。注: loadDataWithBaseURL() を使用し、ベース URL が無効であるか null に設定されている場合、ロードするコンテンツ内のすべてのリンクは絶対でなければなりません。
loadUrl() を呼び出してページをロードした場合、または loadDataWithBaseURL() を使用して有効なベース URL を提供した場合、ページ上のこのタイプのリンクに対して shouldOverrideUrlLoading() コールバックを受け取りますが、受け取る URL は、現在のページ。たとえば、受け取る URL は「showProfile」ではなく「 http://www.example.com/showProfile 」になります。上記のようにリンクで単純な文字列を使用する代わりに、次のようなカスタム スキームを使用できます。
<a href="example-app:showProfile">Show Profile</a>
次に、この URL を shouldOverrideUrlLoading() メソッドで次のように処理できます。
// The URL scheme should be non-hierarchical (no trailing slashes)
private static final String APP_SCHEME = "example-app:";
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(APP_SCHEME)) {
urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");
respondToData(urlData);
return true;
}
return false;
}
HTML を変更できない場合は、loadDataWithBaseURL() を使用して、「example-app:///」などのカスタム スキームと有効なホストで構成されるベース URL を設定できる場合があります。例えば:
webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,
null, "UTF-8", null);
有効なホスト名は RFC 3986 に準拠する必要があり、末尾にスラッシュを含めることが重要です。そうしないと、読み込まれたページからのリクエストがドロップされる可能性があります。