问题描述
我正在使用带有 cordova-plugin-file
的 Apache Cordova 来开发一些 Android 应用程序。自 Android API 29 (Android 10) 起,apps no longer have access to shared 由于隐私问题直接占用空间。
我在 file:///storage/emulated/0/Download/
上存储了一些 pdf 文件,然后用户可以从中打开 pdf 文件。
window.resolveLocalFileSystemURL('file:///storage/emulated/0/Download/',function (dir) {
dir.getFile(filename,{ create: true },function (file) {
file.createWriter(function (fileWriter) {
console.log('Writing content to file')
fileWriter.onwriteend = function () {
console.log('Successful file write...')
}
fileWriter.onerror = onerror
fileWriter.write(DataBlob)
},onerror)
},onerror)
},onerror)
但这在 Android 10 上停止工作。
解决方法
window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory + "/Download" 用来工作
- 这在面向 API 28(现在被 Google Play 禁止)时应该可以正常工作
- 当使用插件的开发版本(具有
android:requestLegacyExternalStorage="true"
)定位 API 29 时,这应该可以工作,或者您可以使用 edit-config 添加此标志。 - 这在面向 API 30 时不起作用,因为 API 30 会忽略
android:requestLegacyExternalStorage
属性。
在以 API 30 为目标之前阅读 Android Notes 很重要。在使用新 API 以 API 30 为目标时,您可能需要将文件迁移到另一个文件夹以保持对它们的访问。 Source。
适用于最高 Android 10 (API 29) 的解决方案
使用插件的开发版本
cordova plugin rm cordova-plugin-file
cordova plugin add https://github.com/apache/cordova-plugin-file.git
我对其进行了测试,它允许我在 Android 10 (API 29) 中使用 cordova.file.externalRootDirectory + "/Download"
到我撰写本文时,还没有针对 Android 11(API 级别 30)的解决方案