3

Android の WebView の特定の名前付きアンカーでローカルに保存されたページを開くと、互換性の問題が発生します。現在、私は単に使用しています

webView.loadUrl("file:///android_asset/page.html#fragment");

これは私の 4.1 デバイスでは正常に動作しますが、他のデバイスのユーザーは動作しないと不満を漏らし続けています。

たとえば、4.0.3では、 URL フラグメント 部分なしでページを#fragment開くと正常に開きますが、ユーザーは「Web ページが利用できません」というエラーを受け取ります。

loadUrl(String)また、メソッドへの2回の呼び出しでフラグメントを開こうとしました。最初はフラグメントなしで、次にフラグメントを使用しました。また、JavaScript を使用してページの場所を変更します。

これ以上何を試すことができますか?

4

1 に答える 1

2

まず、RFC 1738file://ではスキームの URL フラグメント部分が指定されていません。ファイル URI はfile://、ホスト名、およびパスで構成されます。それだけです。

したがって、ファイル URI のアンカーはサポートされるべきではありません。しかし、何らかの理由で、Android は Jelly Bean 以来それらをサポートしています。Ice Cream Sandwich でも作業してもらいたい場合:

private static String BASE_URL = "file:///android_asset/";

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        try {
            if (url.startsWith(BASE_URL) && url.contains("#")) {
                url = url.replace(BASE_URL, "");
                InputStream is = getAssets().open(url.substring(0, url.indexOf("#")));
                return new WebResourceResponse("text/html", "utf-8", is);
            }
        } catch(IOException e) {
            Log.e("DKDK", "shouldInterceptRequest", e);
        }
        return null;
    }
});
于 2013-09-30T18:27:40.313 に答える