Cordova 文件写入抛出 EACCES(权限被拒绝)错误
Cordova file writing throws EACCES (Permission denied) error
我在 Ionic 移动应用程序上使用 cordova-plugin-file
和 cordova-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
我在 Ionic 移动应用程序上使用 cordova-plugin-file
和 cordova-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