Cordova 文件写入抛出 EACCES(权限被拒绝)错误

Cordova file writing throws EACCES (Permission denied) error

我在 Ionic 移动应用程序上使用 cordova-plugin-filecordova-plugin-file-transfer 将一些文件下载到 Android 设备,这些文件可以使用 pdf、word、excel 等本机应用程序打开..ETC。这个插件在 Marshmallow os 更新之前运行良好。

现在正在投掷"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 os 版本。这是我的代码示例

 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/

有人有解决这个问题的想法吗?

根据 cordova-plugin-file 文档,您必须通过将此添加到您的 config.xml:

来明确设置写入外部存储的权限
<platform name="android">
    <.../>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <.../>
</platform>

我认为文档有点难以理解,但您可以在 docs of cordova-plugin-file:

中找到所需的信息

sdcard: The global external file storage directory (this is the root of the SD card, if one is installed). You must have the android.permission.WRITE_EXTERNAL_STORAGE permission to use this.

为了进一步阅读,我可以在相关摘要中推荐官方 android docs

Getting access to external storage In order to read or write files on the external storage, your app must acquire the READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE system permissions...

经过调查,我找到了问题的根本原因。由于 OS 升级到棉花糖,引发了此权限问题错误。他们改变了许可授予程序。 API 23 级后,应用程序在安装时将不会获​​得权限。用户必须在使用应用程序时授予权限。所以我不得不在使用设备资源时显式安装一个插件来授予权限。

我已经写了一篇关于此的快速博客 post 以与社区分享。也感谢@Beat :)

任何人都可以参考 http://anishantha87.blogspot.com/2016/10/read-and-write-permission-for-storage.html 进行快速示例应用。

您可以找到 Android API OS 升级权限参考 here

希望这对其他人有所帮助。

干杯!

我更改了应用程序关注的 android 版本,在 config.xml 中添加了这个标签:

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

并且此更改允许在 Android 8、Android 9、Android 10 和 Android 11 上使用提到的 cordova 插件将文件保存到设备中。

Android 文档建议更改 API 级别版本以避免 Android 10 上的范围存储功能。

您可以在此处获得有关分区存储功能的更多信息:
https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage