Cómo obtener documentos en un directorio de Android que PhoneGap verá

Me gustaría poder copiar algunos archivos en el directorio de documentos de PhoneGap / Cordova para que aparezcan cuando utilice la API del archivo cordova-plugin para listar ese directorio. Desafortunadamente, parece haber alguna desconexión entre la API de archivos y lo que realmente se presenta en el almacenamiento de la tableta. Esto es lo que la especificación de plugin de archivos dice que la estructura del directorio del sistema debería verse así:

Diseño del sistema de archivos Android

  • file:///android_asset/ | Cordova.file.applicationDirectory
  • file:///android_asset/data/data/<app-id>/ | Cordova.file.applicationStorageDirectory
  • file:///android_asset/data/data/<app-id>/cache | Cordova.file.cacheDirectory
  • file:///android_asset/data/data/<app-id>/files | Cordova.file.dataDirectory
  • file:///android_asset/data/data/<app-id>/Documents | Cordova.file.documents
  • <sdcard>/ | Cordova.file.externalRootDirectory
  • <sdcard>/Android/data/<app-id>/ | Cordova.file.externalApplicationStorageDirectory
  • <sdcard>/Android/data/<app-id>/cache | Cordova.file.externalCacheDirectry
  • <sdcard>/Android/data/<app-id>/files | Cordova.file.externalDataDirectory

Desafortunadamente, no veo esto cuando enchufo mi dispositivo (4.4.2 / tableta de Lenovo) en mi PC o Mac. En cambio, veo:

 - Internal Storage |- .IdeaDesktopHD |- .lelauncher |- .magic |- .powercenterhd |- Alarms |- Android |- Audio |- Bluetooth |- Contact |- data |- DCIM |- Document |- Download |- googleota |- legc |- LenovoReaper |- LesyncDownload |- Movies |- MyFavorite |- Notifications |- Others |- Pictures |- Podcasts |- powercenterhd |- Ringtones |- SHAREit 

¿Alguna idea de dónde debería estar copiando los archivos para que mi aplicación pueda verlos?

Bien ahora. Parte de mi problema era que me dieron un poco por la naturaleza asíncrona del sistema de archivos / cordova-plugin-file API en cordova. Tuve que hacer algunos refactorización de código para obtener la lista de archivos para mostrar correctamente, pero una vez que hice, los archivos se muestran correctamente, independientemente de dónde estaban en el dispositivo.

Aquí está el código aplicable. Tenga en cuenta que necesitará el archivo cordova-plugin agregado a su proyecto Cordova / PhoneGap y que no funcionará en el navegador. En realidad, tengo este bloque dentro de otro si / luego bloqueo – si está funcionando en un navegador, muestre el html5 <input type=file> , si está en un dispositivo móvil, muestre este bloque:

 var localURLs = [ cordova.file.dataDirectory, cordova.file.documentsDirectory, cordova.file.externalApplicationStorageDirectory, cordova.file.externalCacheDirectory, cordova.file.externalRootDirectory, cordova.file.externalDataDirectory, cordova.file.sharedDirectory, cordova.file.syncedDataDirectory ]; var index = 0; var i; var statusStr = ""; var addFileEntry = function (entry) { var dirReader = entry.createReader(); dirReader.readEntries( function (entries) { var fileStr = ""; var i; for (i = 0; i < entries.length; i++) { if (entries[i].isDirectory === true) { // Recursive -- call back into this subdirectory addFileEntry(entries[i]); } else { fileStr += (entries[i].fullPath + "<br>"); // << replace with something useful index++; } } // add this directory's contents to the status statusStr += fileStr; // display the file list in #results if (statusStr.length > 0) { $("#results").html(statusStr); } }, function (error) { console.log("readEntries error: " + error.code); statusStr += "<p>readEntries error: " + error.code + "</p>"; } ); }; var addError = function (error) { console.log("getDirectory error: " + error.code); statusStr += "<p>getDirectory error: " + error.code + ", " + error.message + "</p>"; }; for (i = 0; i < localURLs.length; i++) { if (localURLs[i] === null || localURLs[i].length === 0) { continue; // skip blank / non-existent paths for this platform } window.resolveLocalFileSystemURL(localURLs[i], addFileEntry, addError); } 
 scan : function(url,fileType,callback) { var fileTypeCollection = []; var defer = $q.defer(); url.forEach(function(element, index) { //requestLocalFileSystemURL log(element); window.resolveLocalFileSystemURL(element,onRequestFileSystem, fail); log("Ends resolve"); }); function onRequestFileSystem(fileSystem) { var directoryReader = fileSystem.createReader(); directoryReader.readEntries(onReadEntries,fail); } /*onRequestFile Ends*/ function onReadEntries(entries) { if(entries.length==0) { log("Entries Length....Resolving"); defer.resolve(fileTypeCollection); } else { entries.forEach( function(element, index) { if (element.isDirectory === true) { // Recursive -- call back into this subdirectory onRequestFileSystem(element); } if(element.isFile == true) { fileType.forEach(function(type) { if(element.name.indexOf(type) != -1) { fileTypeCollection.push(element); } }); } /*is File ENds*/ }); /*Entries For Each Ends*/ } } /*OnRead Ends*/ function fail(resp) { log(resp); defer.reject(); } /*Fail Ends*/ return defer.promise; } //Scan Function Ends 

Tengo esto para Angularjs. Pero estoy teniendo problemas con esto. Si ejecuta esto se dará cuenta de que la salida se vuelven a enviar más de una vez cuando llamo a esto también promesa no parece funcionar correctamente. Pero funciona con devolución de llamada pero hasta volvería muchas veces y no habría manera de saber cuándo se completó el recorrido completo del archivo.

  • Uso de la función gradleReference en cordova plugin.xml
  • Combinación de servicio de Android, Cordova plugin de fondo y Skype O365 sdk no funciona después de pocas horas mientras se ejecuta en segundo plano?
  • Acceder al almacenamiento interno de android con cordova file plugin
  • Cordova 3.6.3 Plugin de archivos - obtenga archivos de video locales en android
  • Error de compilación de Android al actualizar el complemento de cámara de Cordova
  • Cordova File Plugin - Leer desde la carpeta www?
  • No se puede agregar la dependencia del módulo a CordovaLib para el proyecto Cordova usando Android Studio
  • La conexión de Cordova al servidor no tuvo éxito
  • Android hace que las aplicaciones de Cordova se reinicien cuando se usan los complementos de Cámara y Captura de Cordova
  • Hacer una llamada HTTP POST en Ionic 2 da la respuesta prohibida
  • Cordova-plugin-whitelist trabajando en Android pero no en iOS (Phonegap Build)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.