自 Android 11 (SDK30) 以来,我无法将 HTML 文件从应用程序特定存储加载到 WebView

Posted

技术标签:

【中文标题】自 Android 11 (SDK30) 以来,我无法将 HTML 文件从应用程序特定存储加载到 WebView【英文标题】:I cant load HTML file into WebView from app specific storage since Android 11 (SDK30) 【发布时间】:2022-01-01 04:13:42 【问题描述】:

我的应用有以下用例:

我们从服务器下载用户选择的特定语言的 geojson 文件、html 文件和一些音频文件,并将其保存在应用程序特定的文件目录中。

每个用例的目录路径如下:

对于我们拥有的 HTML 文件:

/storage/emulated/0/android/data/my.example.com/files/ExampleApp/EnginePayload/de/html-file.html

对于我们拥有的json文件:

/storage/emulated/0/Android/data/my.example.com/files/ExampleApp/LocationPayload/de/geojson-file.geojson

音频数据:

/storage/emulated/0/Android/data/my.example.com/files/ExampleApp/Audio/de/intro.mp3
/storage/emulated/0/Android/data/my.example.com/files/ExampleApp/Audio/de/outro.mp3

等等……

由于我必须将 minSDK 和 compileSDK 更改为 30,因此我无法使文件正常工作。 我将 html-file.getAbsolutePath() 加载到 webView 但 webview 客户端不调用任何回调! 音频文件不会启动,因为我们使用 javascript 函数来执行此操作。

据我了解,无需更改应用特定目录,因为即使在 Android 11 上,应用也有权读取和写入自己创建的文件。

当我将它改回 SDK 29 时,一切正常。

我不知道该怎么办。有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

我下班后自己修好了!

我的假设是正确的。该应用程序可以访问这些文件,因为该应用程序自己创建了这些文件。所以这里读取文件没有问题...

这是我的修复,我希望它会在未来对某人有所帮助: WebView 的设置中缺少某些内容。

webView.getSettings().setAllowFileAccess(true);

这让我现在可以从适用于 Android 11 的应用特定目录加载 html 文件(使用绝对路径)。

这是我的代码:

    webView.getSettings().setAllowFileAccess(true);

    File extDir = cxt.getExternalFilesDir(null);
    //htmlPath is something like this: "ExampleApp/EnginePayload/de/html-file.html"
    File twine = new File(extDir.toString() + "/" + htmlPath);

    webView.loadUrl(twine.getAbsolutePath());

【讨论】:

以上是关于自 Android 11 (SDK30) 以来,我无法将 HTML 文件从应用程序特定存储加载到 WebView的主要内容,如果未能解决你的问题,请参考以下文章

如何对运行 Android 11 (SDK 30) 的应用程序崩溃进行故障排除

Android 11(SDK_INT >= 30)后,外部存储权限android.permission.MANAGE_EXTERNAL_STORAGE

Android 11(SDK_INT >= 30)后,外部存储权限android.permission.MANAGE_EXTERNAL_STORAGE

在 InfluxQL/InfluxDB 中获得自 30 天前以来的差异

Android 模拟器不接受键盘输入 - SDK 工具 rev 20

无法创建新的 AVD。没有足够新的 Android SDK 可用