Как сохранить файл в общем пространстве в Cordova с Android?

#android-file #cordova-plugin-file

#android-файл #cordova-plugin-file

Вопрос:

Я использую Apache Cordova cordova-plugin-file для разработки какого-либо приложения для Android. Начиная с Android API 29 (Android 10), приложения больше не имеют прямого доступа к общему пространству из-за проблем с конфиденциальностью.

Я сохранял некоторый PDF-файл file:///storage/emulated/0/Download/ , откуда пользователь мог затем открыть 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.

Как я могу сохранить файл, чтобы он был доступен пользователю?

Ответ №1:

window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory «/ Download» используется для работы

  • Это должно работать как есть при настройке API 28 (теперь запрещено Google Play)
  • Это должно сработать при настройке API 29 с помощью версии плагина для разработчиков (которая имеет android:requestLegacyExternalStorage="true" ), в качестве альтернативы вы можете использовать edit-config для добавления этого флага.
  • Это не сработает при настройке API 30, поскольку API 30 игнорирует android:requestLegacyExternalStorage атрибут.

Важно прочитать примечания к Android, прежде чем переходить на API 30. Возможно, вам потребуется перенести ваши файлы в другую папку, чтобы сохранить к ним доступ при настройке API 30 с использованием новых API. Источник.

Решение для Android до 10 (API 29)

Используйте версию плагина для разработчиков

 cordova plugin rm cordova-plugin-file
cordova plugin add https://github.com/apache/cordova-plugin-file.git
 

Я протестировал его, и он позволяет мне использовать cordova.file.externalRootDirectory "/Download" в Android 10 (API 29)