0

背景

をandroid_assetフォルダにアクセスする際のAndroid 7.0へ移行した後、私は私のWebViewに次のURLをロードするときに私のアプリは、FileUriExposedExceptionでクラッシュしていました気づいFileUriExposedExceptionの取り扱い:のAndroid 7.0への移行 -

webView.loadUrl("file:///android_asset/myFolder/myFile.html") 

私が読んでhereこれは、アンドロイド7.0で導入されたファイルシステムのアクセス許可が変更されたために発生します。ここで、FileUriExposedExceptionは、インテント内でfile:// Uriを共有しようとしたときにスローされます。

私は一時的なアクセス権限(here)のためFileProviderを使用していた、その周り提案作業を実施しようとしたが、私は唯一の使用可能なパスことを見るように私はandroid_assetフォルダに対して、この作品を作るための方法を知りませんFileProviderには、内部と外部のストレージパスが関係します。 HelpActivityから>

Intent intent = new Intent(view.getContext(), HelpActivity.class); 
    startActivity(intent); 

- - MainActivityから

コード

>

webView.loadUrl("file:///android_asset/help/index.html"); 

質問

誰に必要とするとき、この例外を回避するための良い方法を知っていますWebViewのassetsフォルダからファイルを読み込みますか?

android.os.FileUriExposedException: file:///android_asset/help/help.html exposed beyond app through Intent.getData() 
     at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958) 
     at android.net.Uri.checkFileUriExposed(Uri.java:2348) 
     at android.content.Intent.prepareToLeaveProcess(Intent.java:9766) 
     at android.content.Intent.prepareToLeaveProcess(Intent.java:9720) 
     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609) 
     at android.app.Activity.startActivityForResult(Activity.java:4472) 
     at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 
     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 
     at android.app.Activity.startActivityForResult(Activity.java:4430) 
     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
     at android.app.Activity.startActivity(Activity.java:4791) 
     at android.app.Activity.startActivity(Activity.java:4759) 
     at android.content.ContextWrapper.startActivity(ContextWrapper.java:366) 
     at org.chromium.android_webview.ResourcesContextWrapperFactory$WebViewContextWrapper.startActivity(ResourcesContextWrapperFactory.java:118) 
     at org.chromium.android_webview.AwContentsClient.sendBrowsingIntent(AwContentsClient.java:203) 
     at org.chromium.android_webview.AwContentsClient.shouldIgnoreNavigation(AwContentsClient.java:170) 
     at org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(AwContentsClientBridge.java:352) 
     at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
     at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:41) 
     at android.os.Handler.dispatchMessage(Handler.java:105) 
     at android.os.Looper.loop(Looper.java:164) 
     at android.app.ActivityThread.main(ActivityThread.java:6541) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
+2

"Android 7.0に移行した後、私のwebViewに次のURLを読み込むときに、私のアプリがFileUriExposedExceptionでクラッシュしていたことがわかりました。あなたは完全なJavaスタックトレースを投稿できますか? – CommonsWare

+0

@CommonsWareおっと、申し訳ありません、私はそれを追加しました。 – Lauren

+0

stacktraceはstartActivity()によって使用される意図でそのファイルuriを渡そうとするように見えます。 – greenapps

答えて

0

あなたのWebコンテンツは、いくつかの相対パスを介して負荷help.htmlを行くためにWebViewをトリガされたものを含むように表示されます。 WebViewの既定の動作は、既定のWebブラウザーにそのページを読み込むように要求することです。これはfile:///android_asset/Uriの値では機能しません。

したがって、HTMLを見直して、help.htmlにリダイレクトしようとしているものを見つけ出して修正します。また、WebViewWebViewClientを追加することを検討してください。shouldOverrideUrlLoading()でこのようなページ読み込み動作を制御できます。

+0

ありがとう!私の 'HelpActivity'クラスの' WebView'に 'WebViewClient'を追加し、以下に示すように' shouldOverrideUrlLoading'をオーバーライドしました: 'webView.setWebViewClient(new WebViewClient(){@Override public boolean shouldOverrideUrlLoading(WebView webView、String url){webView私が持っていた問題を修正しましたが、Nougatにアップデートする前にこれがなぜ必要でないのか正確には分かりません(また、htmlには相対パスが含まれているようですhrefリンクで) – Lauren