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:
- Cordova CLI Phone Gap Aplicación navigator.app.exit Función no funciona
- Córdoba - modificar o eliminar MainActivity
- Excepción inesperada de nivel superior en Córdoba
- Acceso al código C ++ en Apache Cordova para Android
- Cambiar el icono de la barra de estado de notificaciones push en Android e IOS
- 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?
- ¿Es posible construir Cordova App en línea?
- Pantalla blanca después de Splash en android - ionic 2
- Generación de iconos de iOS y Android en Cordova / PhoneGap
- Cordova Custom Plugin "Argumentos a path.join deben ser cadenas"
- SDK de Android no encontrado. Asegúrese de que está instalado. Si no está en la ubicación predeterminada, establezca la variable de entorno ANDROID_HOME
- La geolocalización iónica 2 nativa no funciona en el dispositivo android
- Cordova - StatusBar escondido en el lanzamiento - Android
- Cordova - Notificar el servicio de fondo en ejecución
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.
- Consola para desarrolladores de Google Play Store: no se puede administrar la lista de probadores para la prueba de beta cerrada
- ¿Cómo obtener el tamaño de la pantalla en Android, incluidos los botones virtuales?