Cordova fichier plugin - enregistrer le fichier dans l'appareil
Je vais avoir beaucoup de problèmes à l'enregistrement de fichiers sur Android.
Le projet est une application hybride développé avec l'Ionique avec ces plugins:
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"
Version de la plateforme Android est 5.2.1
L'appareil que j'utilise est un Samsung A7
C'est un résumé de 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" />
Décision1
si j'essaie avec cet extrait (en fait de travail sur un autre projet)
JS:
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) {});
- Je obtenir {"code":5,"message":"ENCODING_ERR"}
que le Rappel de la $cordovaFile.writeFile
, peu importe si je utiliser le chemin absolu d'un chemin d'accès relatif, juste le nom du fichier et aucun fichier n'est jamais créé.
Case2
Avec cet extrait
JS:
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){});
il arrive de deux choses différentes
Cas 2.1
Si pas de config options sont spécifiées dans config.xml
l'application crée un dossier vide dans /storage/emulated/0/Android/media/{myAPP}
2.2
avec ces deux préférences
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="cache" />
un fichier dans /storage/emulated/0
(SSD externe) est créé et dans logcat
erreurs sont:
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
Le fait étrange est que /storage/extSdCard
(lien symbolique pour /mnt/extSdCard
) n'est pas monté alors que le SSD externe est monté sur /mnt/sdcard
S'il vous plaît aider: je suis headbanging.
Le premier extrait a été travail comme un charme dans un autre projet. Pourrait-il être la version de ngCordova?
Vous devez vous connecter pour publier un commentaire.
RÉSOLU:
après plusieurs tentatives, j'ai résolu de cette façon
dans
config.xml
:et de la fonction principale:
JS:
Il semble que:
qui est la configuration par défaut, ne pouvait pas permettre à l'application d'écrire sur le disque externe (physique ou émulé). Au lieu de cela a permis l'application que pour écrire dans
/data/data/{myApp}/files
d'utiliser cette option plugin : https://github.com/apache/cordova-plugin-file-transfer pour les téléchargements et https://github.com/pwlin/cordova-plugin-pdialog pour afficher la boîte de Dialogue de Progression.