【发布时间】:2016-08-08 15:02:39
【问题描述】:
我在 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"
Android平台版本为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
如果我尝试使用这个 sn-p(实际上是在做另一个项目)
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
有了这个sn-p
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 的符号链接)没有安装,而外部 SSD 安装在 /mnt/sdcard 上
请帮忙:我正在头疼。
第一个 sn-p 在另一个项目中用作魅力。会不会是 ngCordova 的版本?
【问题讨论】:
标签: android cordova cordova-plugins ngcordova cordova-plugin-file