Android 11:AndroidProtocolHandler:WebView 不通过 FileProvider 显示带有本地图像的本地 html 文件

Android 11: AndroidProtocolHandler: WebView does not show local html file with local images via FileProvider

多年来,我的应用一直在下载文件和链接图像,例如下载管理器的“/下载”文件夹。我可以在 WebView 中显示 HTML 内容。

从 Android 11 开始,此解决方案不再可行。指向本地存储图像的链接已损坏。当然我看了很多关于这个主题的帖子。

下载 HTML 文件已成功完成 /Android/data/my.base.package/files 工作。我可以在 WebView 中显示它。

当我也将图像下载到我的手机时,WebView 不显示本地下载的图像。在我下载的 HTML 文件中,我将所用图像的所有外部 URL 转换为本地路径名。

简化的 HTML 文件如下所示:

<html...>... 
<img alt="some picture" src="file:///storage/emulated/0/Android/data/my.base.package/files/some-picture.png" />
</html>

在 WebView 中显示 HTML 已简化:

String baseUrl = null; // or "file:///storage/emulated/0/Android/data/base.package.name/files"
myWebView.setWebViewClient(new WebViewClient() {
    view.postDelayed(new Runnable() {
       public void run() { // will convert it to Lambda ;-)
           gcLongDescr.scrollTo(0, scrollPosition);
       }
    }, 300);
});
myWebView.loadDataWithBaseURL( baseUrl, the-html-string, "text/html", "utf-8", null);

QUESTION :假设我可以在 WebView 中显示 HTML 文件(作为字符串)。如何使用下载图片的(相对)文件路径名?

尝试 1:在我的 HTML 中使用绝对路径名。不起作用。

尝试 2:使用 /Download 文件夹。 Environment 上的 getExternalStorageDirectory() 和 getExternalStoragePublicDirectory() 等方法已弃用。

尝试 3:使用文件提供程序存储图像文件。

UPDATE: 最后一种方法似乎是正确的方法。但我现在收到以下错误:

E/AndroidProtocolHandler: Unable to open content URL: content://nl.xyz.abc.provider/myimages/some-picture.png

第 1 步:创建文件提供程序:在我的 AndroidManife

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="nl.xyx.abc.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

将提供商路径添加到 XML 文件夹:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    ...
    <files-path name="files" path="." />
    <files-path path="images" name="myimages" />
</paths>

第2步:我将图片文件复制到文件夹file:///storage/emulated/0/Android/data/my.base.package/files/图片。

步骤 3:在下载的 HTML 文件中,我通过 FileProvider 将外部图像 URL 更改为本地文件。一个例子是:

<img alt="some image" src="content://nl.xyz.abc.provider/myimages/some-picture.png" />

问题是关于 使用正确的文件夹和 [2] 从 Android 11 开始在 WebView 中加载本地图像。

首先,下载的图片应该复制到应用程序的正确文件夹中,所以/Android/data/etc。

其次,问题的原因是webSetting.setAllowFileAccess方法在AndroidSDK 29及之前版本默认为true,30及之后版本默认为false。 .

中对此进行了解释

这成功了:

webView = (WebView) rootView.findViewById(R.id.geocahe_description_web_view);
// webview settings ... 
webView.getSettings().setAllowFileAccess(true);  // <----- added!

图像文件可以下载到例如/Android/data/my.base.package/files/images.我只是参考了绝对文件名,没问题!