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.我只是参考了绝对文件名,没问题!
多年来,我的应用一直在下载文件和链接图像,例如下载管理器的“/下载”文件夹。我可以在 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" />
问题是关于
首先,下载的图片应该复制到应用程序的正确文件夹中,所以/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.我只是参考了绝对文件名,没问题!