2012-02-07 38 views
19

En mi aplicación PhoneGap/jQuery Mobile, actualmente estoy usando la API Camera de PhoneGaps para permitir que el usuario tome una foto, que también está almacenada en Camera Roll. Estoy configurando DestinationType en FILE_URI y guardando esta ruta en un db local. Sin embargo, FILE_URI es una ruta a una ubicación temporal que se destruye cuando se cierra la aplicación. Estaba pensando en guardar el nombre de la imagen y luego recuperar la imagen de Camera Roll. ¿Hay alguna ruta que pueda usar para recuperar más tarde las imágenes en Camera Roll?Phonegap - Recuperar foto desde Camera Roll a través de la ruta

estaba guardando las imágenes como base 64 en el PP, pero estoy un poco cansado de este método debido a esta nota en el PhoneGap API Doc:

Nota: La calidad de imagen de imágenes tomadas con la cámara en dispositivos más nuevos es bastante bueno. La codificación de tales imágenes con Base64 ha causado problemas de memoria en algunos de estos dispositivos (iPhone 4, BlackBerry Torch 9800). Por lo tanto, usar FILE_URI como 'Camera.destinationType' es altamente recomendado.

EDIT:

¡Gracias trabajar con la respuesta de @Simon MacDonald. Aquí está mi código despojada:

function capturePhoto() { 
    navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 25, destinationType: Camera.DestinationType.FILE_URI }); 
} 

function onPhotoURISuccess(imageURI) { 
    createFileEntry(imageURI); 
} 

function createFileEntry(imageURI) { 
    window.resolveLocalFileSystemURI(imageURI, copyPhoto, fail);  
} 

function copyPhoto(fileEntry) { 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys) { 
     fileSys.root.getDirectory("photos", {create: true, exclusive: false}, function(dir) { 
       fileEntry.copyTo(dir, "file.jpg", onCopySuccess, fail); 
      }, fail); 
    }, fail); 
} 

function onCopySuccess(entry) { 
    console.log(entry.fullPath) 
} 

function fail(error) { 
    console.log(error.code); 
} 
+0

Estoy tratando de manejar esta misma situación, y su código publicado parece que funciona y me sale todo el camino hasta su función onCopySuccess, pero aún no veo imágenes en mi Camera Roll ni en ningún otro álbum. La entrada que obtengo en la función onCopySuccess describe un archivo que se borra cuando se borra la temperatura. - Yoh Suzuki acaba de editar –

+1

El código anterior no guardará la foto en un álbum, sino en la carpeta Documentos de su aplicación. La ruta a la foto se verá más o menos así: '" /var/mobile/Applications/017323CA-35C1-4D50-9CBA-DCC7C697FAF1/Documents/photos/file.jpg " '. La cadena arbitraria es la carpeta que iOS crea para su aplicación. Para guardar una foto en el carrete de la cámara, en la llamada getPicture, agréguela al objeto de opciones: '" savePhotoToAlbum ":" true "'. Tenga en cuenta que no puede obtener la ruta de la imagen en Camera Roll (AFAIK), por lo que debe guardar una copia en la carpeta Documentos de su aplicación. – Casey

+0

savePhotoToAlbum no parece funcionar para mí, y no está en la documentación. –

Respuesta

10

Después de recuperar el archivo utilizando el método FILE_URI se debe utilizar la API de archivos para copiar la imagen desde la carpeta temporal a la carpeta Documentos y almacenar el nuevo camino en su base de datos .

Así tomaría el resultado de su getPicture() pasarlo a window.resolveLocalFileSystemURI() para obtener un FileEntry. Luego puede llamar al método FileEntry.copyTo() para hacer una copia de seguridad de su archivo.

+1

Gracias. Hasta aquí todo bien. Tengo problemas para crear un directorio donde copiar la foto porque no estoy seguro de qué especificar como parámetro de ruta completa al crear una instancia de DirectoryEntry. El ejemplo de doc se ve como el padre del documento HTML, pero no tengo mucho que ver con eso. ¿Sabes qué se debe especificar como parámetro de ruta completa? – Casey

+0

No importa, lo descubrí. Gracias. Publicaremos el código aquí en un segundo. – Casey

+0

Simon. Supongo que no tienes un código de ejemplo de cómo se podría lograr esto, ¿verdad? – pleshy

0

sentimos que tenía que crear un post aparte porque no tengo la reputación suficiente para comentar.

Gracias Simon por el consejo y Casey por la solución.

Estaba trabajando en una aplicación de Cordova que requiere que tome una foto en iOS, guárdela en un directorio y el enlace en el almacenamiento local para acceder más tarde. Después de que el usuario envía la imagen, la aplicación debe eliminarla del directorio.

Aquí están los códigos de cómo hacerlo y también cómo puede ver la carpeta Documentos del proyecto.

Puede obtener el directorio completo de la imagen que desea eliminar utilizando $ ('# pictureid'). Attr ('src').

function deletePic(file){ 
    console.log("deleting: "+file+"..."); 
    var file = "photos/"+file.toString().split('/').slice(-1)[0]; //gets photo name 

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys){ 
    fileSys.root.getFile(file, 
       {create:false}, 
       function(entry){ 
        entry.remove(); 
       }, resOnErrorDelete); 
       }, 
    resOnErrorDelete);   
} 

function resOnErrorDelete(error) { 
    console.log("resOnErrorDelete: "+error.code); 
} 

Alternativamente, si usted tiene un formulario con varios archivos adjuntos de fotos, es posible que desee dar a los documentos carpeta que creó para almacenar las fotos un nombre único. De esta manera, puede eliminar toda la carpeta después de enviar el lote de fotos en lugar de eliminarlas una a una.

function deleteFolder(folder){ 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys){ 
    fileSys.root.getDirectory(folder, 
       {create:true, exclusive: false}, 
       function(entry){ 
        entry.removeRecursively(); 
       }, resOnErrorDelete); 
       }, 
    resOnErrorDelete);   
} 

function resOnErrorDelete(error) { 
    console.log("resOnErrorDelete: "+error.code); 
} 

Como para acceder a la carpeta de los documentos del proyecto, es necesario editar el plist para permitir iTunes File Sharing

Ir a [project_folder]/plataformas/ios/[project_name]/[project_name] -Info.plist. Haga clic derecho y abrir con XCode.

Verá una tabla de claves. Haga clic derecho en cualquier lugar debajo de la tabla y agregue fila. Se creará una nueva fila. Haga doble clic en la clave y escriba UIFileSharingEnabled. Cambiará automáticamente a La aplicación admite el intercambio de archivos de iTunes, ponga ese valor de clave en .

Ahora, si va a iTunes en las aplicaciones de su dispositivo iOS, desplácese hasta abajo para ver el área de Uso compartido de archivos donde puede ver su carpeta. Sin embargo, está ahí para que 'guarde' pero no edite.

Espero que toda esta información adicional ayude. Me llevó 2 días de investigación averiguarlo.

0

Compartiendo mi versión que usa promises y resolveLocalFileSystemURL excepto resolLocalFileSystemURI porque el segundo está en desuso. También usa el nombre del archivo original en el nuevo creado.

function copyPhotoToAppDir(imageURI) { 
    if(!imageURI){ 
    console.warn("You need to pass imageURI"); 
    return; 
    } 

    var fileNameSplit = imageURI.split("/"), 
    fileName = fileNameSplit[fileNameSplit.length - 1], 
    deferred = $q.defer(); 

    var copyPhoto = function(fileEntry) { 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys) { 
     fileSys.root.getDirectory("photos", {create: true, exclusive: false}, function(dir) { 
     fileEntry.copyTo(dir, fileName, onCopySuccess, onFileFail); 
     }, onFileFail); 
    }, onFileFail); 
    }; 

    var onCopySuccess = function onCopySuccess(entry) { 
    console.log("NEW PATH", entry.fullPath); 
    deferred.resolve(entry.fullPath); 
    }; 

    var onFileFail = function (error) { 
    console.log("COPY FAIL", error); 
    deferred.reject(); 
    }; 

    window.resolveLocalFileSystemURL(imageURI, copyPhoto, onFileFail); 

    return deferred.promise; 
} 

Uso:

var uri = "path1"; 
copyPhotoToAppDir(uri).then(function(newURI){ 
    console.log(newURI); 
}); 

múltiple uso URI:

var uriArr = ["path1", "path2"]; 
    copyPhotoPromises = []; 

uriArr.forEach(function(val){ 
    copyPhotoPromises.push(copyPhotoToAppDir(val)); 
}); 
$q.all(copyPhotoPromises).then(function(values){ 
    console.log("Array with new paths", values); 
}); 

Nuevos URI de archivos se guardarán como "/photos/fileName.jpg". para obtener la ruta absoluta, puede utilizar:

cordova.file.documentsDirectory + newFileUri.substring(1); 

estoy usando $ q angular de aquí para manejar promesas pero se puede cambiar fácilmente a una jQuery.

deferred = $q.defer(); 

tendría que ser cambiado a:

deferred = jQuery.Deferred(); 

Saludos

Cuestiones relacionadas