gpt4 book ai didi

android - Cordova 文件插件 - 在设备中保存文件

转载 作者:太空狗 更新时间:2023-10-29 15:40:36 24 4
gpt4 key购买 nike

我在 Android 中保存文件时遇到了很多麻烦。
该项目是一个使用 Ionic 开发的混合应用程序,具有以下插件:

com.phonegap.plugins.fileopener 1.0.0 "File Opener"
com.telerik.plugins.nativepagetransitions 0.4.2 "Native Page Transitions"
cordova-plugin-compat 1.0.0 "Compat"
cordova-plugin-crosswalk-webview 2.0.0 "Crosswalk WebView Engine"
cordova-plugin-file 4.2.0 "File"
cordova-plugin-network-information 1.2.2-dev "Network Information"
cordova-plugin-whitelist 1.2.3-dev "Whitelist"
cordova-plugin-wkwebview-engine 1.0.4-dev "Cordova WKWebView Engine"
ionic-plugin-keyboard 2.2.1 "Keyboard"

安卓平台版本为5.2.1
我使用的设备是 Samsung A7

这是AndroidManifest.xml的摘要

<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

案例1

如果我尝试使用这个 fragment (实际上是在处理另一个项目)

var storagePath = "/storage/emulated/0";
var fileDir = cordova.file.externalDataDirectory.replace(cordova.file.externalRootDirectory, '');
var fileName = $scope.ngDocument.documentId + ".pdf"
var filePath = storagePath + "/" + fileDir + fileName;
$cordovaFile.writeFile(filePath, BINARY_ARR, {'append': false}).then(function(result) {}, function(err) {});

我从 $cordovaFile.writeFile 得到 {"code":5,"message":"ENCODING_ERR"} 作为回调,不管我是否使用绝对路径, 相对路径,只有文件名,不会创建任何文件。

案例2

有了这个 fragment

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
console.log('file system open: ' + fs.name);
fs.root.getFile(fileName, { create: true, exclusive: false }, function (fileEntry) {
console.log("fileEntry:" + JSON.stringify(fileEntry));
writeFile(fileEntry, BINARY_ARR);
}, function(data){});
}, function(data){});

发生两件不同的事情

案例2.1

如果在 config.xml 中没有指定配置选项,应用会在/storage/emulated/0/Android/media/{myAPP} 中创建一个空文件夹

案例2.2

有了这两个偏好

<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="cache" />

/storage/emulated/0(外部 SSD)中创建了一个文件,在 logcat 中的错误是:

E/Vold    ( 2280): Failed to find mounted volume for /storage/extSdCard/Android/data/{myApp}/files/
W/Vold ( 2280): Returning OperationFailed - no handler for errno 0
W/ContextImpl(13364): Failed to ensure directory: /storage/extSdCard/Android/data/{myApp}/files
E/Vold ( 2280): Failed to find mounted volume for /storage/extSdCard/Android/data/{myApp}/files/
W/Vold ( 2280): Returning OperationFailed - no handler for errno 0
W/ContextImpl(13364): Failed to ensure directory: /storage/extSdCard/Android/data/{myApp}/files
E/Vold ( 2280): Failed to find mounted volume for /storage/extSdCard/Android/data/{myApp}/cache/
W/Vold ( 2280): Returning OperationFailed - no handler for errno 0
W/ContextImpl(13364): Failed to ensure directory: /storage/extSdCard/Android/data/{myApp}/cache

奇怪的是 /storage/extSdCard(/mnt/extSdCard 的符号链接(symbolic link))没有挂载,而外部 SSD 挂载在 /mnt/SD卡

请帮忙:我要撞头了。
第一个 fragment 在另一个项目中起到了魅力的作用。难道是ngCordova的版本?

最佳答案

已解决:

经过多次尝试我是这样解决的

config.xml 中:

<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="files,cache, sdcard, cache-external, files-external" />

和主要功能:

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {

//var absPath = "file:///storage/emulated/0/";
var absPath = cordova.file.externalRootDirectory;
var fileDir = cordova.file.externalDataDirectory.replace(cordova.file.externalRootDirectory, '');
var fileName = "somename.txt";
var filePath = fileDir + fileName;

fs.root.getFile(filePath, { create: true, exclusive: false }, function (fileEntry) {
writeFile(fileEntry, BINARY_ARR).then(function(){
//do something here
});
}, function(err) {});
}, function(err) {});

function writeFile(fileEntry, dataObj) {
return $q(function (resolve, reject) {
fileEntry.createWriter(function (fileWriter) {
fileWriter.onwriteend = function () {
resolve();
};
fileWriter.onerror = function (e) {
reject(e);
};
fileWriter.write(dataObj);
});
});
}

似乎是:

<preference name="AndroidPersistentFileLocation" value="Internal" />

这是默认配置,不允许应用程序写入外部磁盘(无论是物理磁盘还是模拟磁盘)。相反,只允许应用程序写入 /data/data/{myApp}/files

关于android - Cordova 文件插件 - 在设备中保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com