2017-07-07 24 views
0

API 24以上をターゲットにする場合、HTMLリンクを使用してWebViewのローカルファイル(HTMLページ)にナビゲートするにはどうすればよいですか?ターゲットAPIを使用したWebViewのローカルファイルへのHTMLリンク24

これは以前に議論されており、解決方法はfile:// URIスキームを使用します。これまで働いていた何 はWebViewに表示され、リンクをクリックすると、ローカルのページapp/src/main/assets/my_page.htmlをロードするHTMLファイルに

<a href="file:///android_asset/my_page.html">Go to local page</a> 

を使用していました。

ただし、このようなリンクをクリックすると、API24からFileUriExposedExceptionが発生します。 logcatから:「アプリケーションが別のアプリケーションにfile://ウリを公開しています。」とき

mypackage.myapp W/System.err: android.os.FileUriExposedException: file:///android_asset/my_page.html exposed beyond app through Intent.getData() 
... 
mypackage.myapp W/System.err:  at org.chromium.android_webview.ResourcesContextWrapperFactory$WebViewContextWrapper.startActivity(ResourcesContextWrapperFactory.java:121) 
mypackage.myapp W/System.err:  at org.chromium.android_webview.AwContentsClient.sendBrowsingIntent(AwContentsClient.java:203) 

文書によると、これがスローされます。ログによれば、すべてがmypackage.myappの中で起こっているようだから、なぜこれが当てはまるのだろうか。

代わりにcontent:// URIスキームを使用することがドキュメントに示されていますが、これはHTMLファイルでは機能しません。

答えて

2

this answerに基づいて)次の回避策はWebViewにおけるfile:// URIのローディングを傍受し、次いでWebView.loadUrl(...)とアプリケーションコードによって直接ロードします。これは、WebViewに渡されたWebViewClientで、WebView.shouldOverrideUrlLoadingを上書きすることによって可能です。それを初期化するとき。

API 24にこの方法のためのAPIの変更があったように、互換性のために技術的にAPIのコード内の2つのバージョン(一方はまたWebView例外ためfile:// URIを開くせ、前のように行うことができ< 24の場合もありますAPI <を実行するデバイスでは発生しません24)。

if (android.os.Build.VERSION.SDK_INT >= 24) { 
    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { 
      if (webResourceRequest.getUrl().getScheme().equals("file")) { 
       webView.loadUrl(webResourceRequest.getUrl().toString()); 
      } else { 
       // If the URI is not pointing to a local file, open with an ACTION_VIEW Intent 
       webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, webResourceRequest.getUrl())); 
      } 
      return true; // in both cases we handle the link manually 
     } 
    }); 
} else { 
    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView webView, String url) { 
      if (Uri.parse(url).getScheme().equals("file")) { 
       webView.loadUrl(url); 
      } else { 
       // If the URI is not pointing to a local file, open with an ACTION_VIEW Intent 
       webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
      } 
      return true; // in both cases we handle the link manually 
     } 
    }); 
} 

WebViewによって作成Intentとは何かを持っている必要がありますリンクを開くが、私はそれが別のアプリにさらされているかどうかをどのように表示されていないWebViewをさせる時に例外がある理由。 WebViewは、リンクをクリックしたときに、アプリが制御を取得し、WebView.loadUrl(...)に渡すことでfile:// URIのdirecltyを開き、代わりに、リンク(何Intentが作成されない)で何もしていないため、回避策が機能することを

はその後です - それはうまくいくようです。

URIは、この単一のファイルWebViewで指しているファイルをロードするためにのみ使用されるため、これは問題ないと思います(問題があれば、システムはFileUriExposedExceptionを投げます)。

0

私はあなたが他のページをロードする必要がある場合の方法HTMLにリンクしません:

<a href="file:///android_asset/my_page.html">Go to local page</a> 

を私マップカルコゲノフルバレン骨格がthisのように見えるので、私はこのようにリンク:

<a href="my_page.html">Go to local page</a> 

あなただけ必要その方法はあなたのMainActivityにあります。Javaおよびそれが動作します:

private class MyBrowser extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mailto:") || url.startsWith("mms:") || url.startsWith("mmsto:") || url.startsWith("market:")) { 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
     else { 
      view.loadUrl(url); 
      return true; 
     } 
    } 
} 

ご質問を持っているか、それはまだ私が

を教えて動作しない場合
関連する問題