Cordova文件写入抛出EACCES(Permission denied)错误

时间:2016-10-17 05:17:34

标签: angularjs cordova ionic-framework cordova-plugins ngcordova

我在Ionic移动应用程序上使用cordova-plugin-filecordova-plugin-file-transfer将一些文件下载到Android设备,该设备可以使用pdf,word,excel等原生应用程序打开。这个插件在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 reader,word,excel..etc

插件参考:

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

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

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

任何人都有想法解决这个问题吗?

2 个答案:

答案 0 :(得分:7)

调查结束后,我找到了问题的根本原因。由于OS升级到Marshmallow,此权限问题错误。他们已经更改了许可授予程序。在API级别23之后,应用程序在安装时将无法获得许可。用户必须在使用应用程序时授予权限。因此,我必须明确安装插件以在使用设备资源时授予权限。

我写了一篇关于此的快速博客文章,与社区分享。还要感谢@Beat :))

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

您可以找到适用于操作系统升级权限的Android API参考here

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

干杯!

答案 1 :(得分:-2)

根据cordova-plugin-file文档,您必须通过将此权限添加到config.xml来设置写入外部存储的权限:

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

我认为文档理解起来有点棘手,但您可以在docs of cordova-plugin-file中找到所需的信息:

  

sdcard :全局外部文件存储目录(如果安装了SD卡,则为SD卡的根目录)。您必须具有android.permission.WRITE_EXTERNAL_STORAGE权限才能使用此功能。

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

  

访问外部存储空间   要在外部存储上读取或写入文件,您的应用必须获取READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE系统权限...