Android 7.0 迁移 - 访问 android_asset 文件夹时处理 FileUriExposedException
Android 7.0 Migration - Handling FileUriExposedException when accessing android_asset folder
背景
迁移到 Android 7.0 后,我注意到在我的 webView 中加载以下 url 时,我的应用程序因 FileUriExposedException
而崩溃:
webView.loadUrl("file:///android_asset/myFolder/myFile.html")
我读到 here 发生这种情况是因为 Android 7.0 中引入了一些文件系统权限更改,其中在尝试共享文件时抛出 FileUriExposedException
:// Uri在意图中。
我尝试实施建议的解决方法,即使用 FileProvider
获得临时访问权限 (here),但我不知道有什么方法可以使 android_asset
文件夹,因为我只看到 FileProvider
的可用路径涉及内部和外部存储路径。
代码
来自 MainActivity ->
Intent intent = new Intent(view.getContext(), HelpActivity.class);
startActivity(intent);
来自 HelpActivity ->
webView.loadUrl("file:///android_asset/help/index.html");
问题
有谁知道在需要从 webView 的资产文件夹中加载文件时解决此异常的好方法?
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)
您的 Web 内容似乎包含触发 WebView
通过某些相对路径加载 help.html
的内容。 WebView
的默认行为是要求默认 Web 浏览器加载该页面。这不适用于 file:///android_asset/
Uri
值。
因此,查看 HTML,找出试图重定向到 help.html
的内容并修复它。此外,考虑向 WebView
添加 WebViewClient
,您可以在其中通过 shouldOverrideUrlLoading()
.
控制此类页面加载行为
背景
迁移到 Android 7.0 后,我注意到在我的 webView 中加载以下 url 时,我的应用程序因 FileUriExposedException
而崩溃:
webView.loadUrl("file:///android_asset/myFolder/myFile.html")
我读到 here 发生这种情况是因为 Android 7.0 中引入了一些文件系统权限更改,其中在尝试共享文件时抛出 FileUriExposedException
:// Uri在意图中。
我尝试实施建议的解决方法,即使用 FileProvider
获得临时访问权限 (here),但我不知道有什么方法可以使 android_asset
文件夹,因为我只看到 FileProvider
的可用路径涉及内部和外部存储路径。
代码
来自 MainActivity ->
Intent intent = new Intent(view.getContext(), HelpActivity.class);
startActivity(intent);
来自 HelpActivity ->
webView.loadUrl("file:///android_asset/help/index.html");
问题
有谁知道在需要从 webView 的资产文件夹中加载文件时解决此异常的好方法?
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)
您的 Web 内容似乎包含触发 WebView
通过某些相对路径加载 help.html
的内容。 WebView
的默认行为是要求默认 Web 浏览器加载该页面。这不适用于 file:///android_asset/
Uri
值。
因此,查看 HTML,找出试图重定向到 help.html
的内容并修复它。此外,考虑向 WebView
添加 WebViewClient
,您可以在其中通过 shouldOverrideUrlLoading()
.