Запись файла Cordova выдает ошибку EACCES (отказано в разрешении)

#angularjs #cordova #ionic-framework #cordova-plugins #ngcordova

#angularjs #cordova #ionic-framework #cordova-плагины #ngcordova

Вопрос:

Я использовал cordova-plugin-file cordova-plugin-file-transfer мобильное приложение Ionic для загрузки некоторых файлов на устройство Android, которые можно открывать с помощью собственных приложений, таких как pdf, word, Excel и т. Д. Этот плагин работал отлично до обновления ОС Marshmallow.

Теперь он выбрасывает "exception":"/storage/emulated/0/logo_radni.png: open failed: EACCES (Permission denied)"} .

в config.xml файл я также добавил следующие разрешения.

 <platform name="android">
   <preference name="AndroidPersistentFileLocation" value="Compatibility" />
   <preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external,assets,root" />
</platform>
 

Это работает на предыдущей версии ОС Android. Вот мой пример кода

  angular.module('starter.controllers', ['ionic', 'ngCordova'])
 .controller('DashCtrl', function ($scope, $ionicPlatform, $cordovaFileTransfer) {

    $scope.downloadFile = function () {
            $ionicPlatform.ready(function () {

              // File for download
                var url = "http://www.gajotres.net/wp-content/uploads/2015/04/logo_radni.png";

                // File name only
                var filename = url.split("/").pop();

                // Save location
                var targetPath = cordova.file.externalRootDirectory   filename;

                $cordovaFileTransfer.download(url, targetPath, {}, true).then(function (result) {
                    console.log('Success');
                }, function (error) {
                    console.log(JSON.stringify(error));
                }, function (progress) {
                    // PROGRESS HANDLING GOES HERE
                });
            });

        };
    })
 

Примечание:

Мне нужно загрузить файлы, cordova.file.externalRootDirectory чтобы предоставить доступ к другим приложениям, таким как программы для чтения PDF, word, Excel .. и т. Д

Ссылки на плагины:

https://github.com/apache/cordova-plugin-file

https://github.com/apache/cordova-plugin-file-transfer

http://ngcordova.com/docs/plugins/fileTransfer/

У кого-нибудь есть идея разобраться с этим?

Комментарии:

1. какую версию cordova вы используете?

2. вы можете использовать https://www.npmjs.com/package/cordova-plugin-android-permissions этот плагин для запроса разрешения

3. @DivyeshSavaliya Я использую версию: 5.1.1, platformVersion: 5.1.1. Предоставленная вами ссылка не работает

4. На какой версии Android вы развертываете? И какие версии плагинов вы используете?

5. @Beat, как я уже упоминал, версия Android — 6.0.1 (Marshmallow). Последние плагины из приведенной выше ссылки

Ответ №1:

После расследования я смог найти основную причину проблемы. Эта ошибка проблемы с разрешением возникает из-за обновления ОС до Marshmallow. Они изменили процедуру предоставления разрешений. После уровня API 23 приложения не получат разрешения во время установки. Пользователи должны предоставить разрешение во время использования приложения. Поэтому мне пришлось явно установить плагин для предоставления разрешений во время использования ресурсов устройства.

Я написал краткое сообщение в блоге об этом, чтобы поделиться с сообществом. Также спасибо @Beat 🙂

Любой может сослаться на http://anishantha87.blogspot.com/2016/10/read-and-write-permission-for-storage.html для быстрого нанесения образца.

Вы можете найти ссылку на Android API для разрешений на обновление ОС здесь.

Надеюсь, это будет полезно для кого-то еще.

Приветствия!

Комментарии:

1. Отлично работает, большое вам спасибо… сэкономлено много времени

Ответ №2:

Я изменил версию Android, на которую ориентировано приложение, добавив этот тег в config.xml:

 <preference name="android-targetSdkVersion" value="28" />
 

И это изменение позволяет сохранять файлы на устройстве с использованием упомянутых плагинов cordova на Android 8, Android 9, Android 10 и Android 11.

Документация Android рекомендует изменить версию уровня API, чтобы избежать функции ограниченного хранилища на Android 10.

Более подробную информацию о функции хранилища с ограниченной областью действия вы получите здесь:
https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage

Ответ №3:

Согласно cordova-plugin-file документам, вы должны явно установить разрешения на запись во внешнее хранилище, добавив это в свой config.xml :

 <platform name="android">
    <.../>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <.../>
</platform>
 

Я думаю, что документация немного сложна для понимания, но вы уже можете найти необходимую информацию в документах cordova-plugin-file:

sdcard: глобальный каталог внешнего хранилища файлов (это корень SD-карты, если она установлена). У вас должно быть разрешение android.permission.Разрешение WRITE_EXTERNAL_STORAGE на использование этого.

И для дальнейшего чтения я могу порекомендовать официальные android документы в соответствующем реферате:

Получение доступа к внешнему хранилищу Для чтения или записи файлов во внешнее хранилище ваше приложение должно получить системные разрешения READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE…

Комментарии:

1. Я все еще пытаюсь добавить разрешения, как вы упомянули. До сих пор не удалось добраться до него. ` <config-file target=»AndroidManifest.xml » parent=»/manifest»> <использует-имя разрешения=»android.permission. WRITE_EXTERNAL_STORAGE» /> <использует-имя разрешения=»android.permission. READ_EXTERNAL_STORAGE» /> </config-file>`

2. Поместите его в свой config.xml в корневом каталоге вашего приложения, как указано в документах cordova