Cordova fileTransfer funciona perfecto en iOS, lanza el código de error = 1 en Android
Estoy desarrollando una aplicación móvil para iOS y Android utilizando Cordova y Ionic Framework. Debe haber "Enviar foto" y la funcionalidad relacionada, y estoy usando Cordova FileTransfer para hacer esto.
Funciona perfectamente en el simulador de iOS, pero lanza "código de error = 1" en el dispositivo Android.
- HTML5, JS motores de juego para móviles
- Cómo podemos capturar un dispositivo móvil "Siguiente" presionar tecla en Javascript
- PhoneGap vs Android e iOS
- Cómo obtener MarkerId en Artoolkitplus en android
- Equivalente de iOS NSNotificationCenter en Android?
Sé que esto significa file_not_found
o similar.
Tenga en cuenta que sucede si tomo una foto de la cámara, o elige uno de la galería.
Aquí está mi código:
$scope.takePic = function() { var options = { quality: 50, destinationType: navigator.camera.DestinationType.FILE_URI, sourceType: 0, // 0:Photo Library, 1=Camera, 2=Saved Photo Album encodingType: 0 // 0=JPG 1=PNG } navigator.camera.getPicture(onSuccess, onFail, options); } var onSuccess = function(FILE_URI) { window.resolveLocalFileSystemURL(FILE_URI, function(fileEntry) { alert("full: " + JSON.stringify(fileEntry)); var realUrl = fileEntry.toURL(); $scope.picData = realUrl; $scope.$apply(); console.log("real URL", realUrl); }); }; var onFail = function(e) { console.log("On fail " + e); } function win(r) { console.log("Code = " + r.responseCode); console.log("Response = " + r.response); console.log("Sent = " + r.bytesSent); Flash.success("Wysłano"); var response = JSON.parse(r.response); $scope.attachment_id = response.data; $scope.$apply(); $http.post($rootScope.baseServerUrl + 'Members/changeAvatar', {attachment_id: response.data}).success( function (response){ console.log(response); }); } function fail(error) { alert("An error has occurred: Code = " + error.code); console.log("upload error source " + error.source); console.log("upload error target " + error.target); } $scope.send = function() { Flash.warning('wysyłam'); var myImg = $scope.picData; alert(myImg); var options = new FileUploadOptions(); options.headers = { Accept: "application/json", Connection: "close" } options.fileKey="file"; options.fileName=$scope.picData.substr($scope.picData.lastIndexOf('/')+1); options.mimeType="image/jpeg"; options.chunkedMode = false; var ft = new FileTransfer(); ft.upload(myImg, encodeURI($rootScope.baseServerUrl + 'media/Attachments/add'), win, fail, options); }
$scope.takePic
y send
son llamados por clics de botón. Hay un montón de alertas y consola porque estoy tratando de encontrar por qué no funciona.
Después de escoger una imagen de la galería en android consigo:
file: ///storage/sdcard0/download/file-name.jpg
en el simulador de iOS:
file: ///Users//Library/Application%20Support/iPhone%20Simulator/7.1/Applications/B5FB2081-54E7-4335-8856-84C6499E6B07/tmp/cdv_photo_038.jpg
y usando esta trayectoria puedo demostrar esta imagen usando <img src="{{picData}}">
esto trabaja en ambas plataformas.
Pero si trato de enviarlo en un dispositivo Android me sale el código de error = 1. En iOS sim envía, foto, obtiene respuesta adecuada, cambia avatar … todo.
Tanto Cordova como los plugins File y FileTransfer están al día.
- No se puede cargar el archivo xml con jquery en el proyecto de phonegap desde la ruta de los recursos
- ¿Es posible usar Dropbox, Google Drive, Skydrive, etc. como un espacio de servidor?
- Cómo cambiar el tamaño de un elemento de Java Script para que se ajuste a su ventana de contenedor
- ¿Cómo puedo mostrar pdf en html (respuesta / solución de navegación cruzada)
- Sincronizar datos de aplicaciones entre iOS y Android
- Lenguaje de programación universal para Android, iPhone y Windows Phone
- Guardar datos confidenciales en React Native
- Cómo medir y mejorar el uso de la batería en el iPhone / iPad juego (Android también)
Parece que podría tener un error de ruta de acceso, file:///storage.sdcard0/download/file-name.jpg
debería ser file:///storage/sdcard0/download/file-name.jpg
si no me equivoco .
De leer su código, no parece que esté analizando algo incorrectamente. ¿Tal vez usted quiere intentar usar una versión más vieja más estable del plugin del archivo si está devolviendo el URI incorrecto (y puede ser que archive un informe del error)? No he utilizado el plugin de archivo desde que lanzaron 1.0, pero por experiencia personal ha habido bugs / regresiones en las liberaciones de borde de sangrado antes.
Puede orientar versiones específicas de complementos desde el cordova-cli utilizando @
como cordova plugin add [email protected]
Además de etiquetas específicas / releases de github usando #
como cordova plugin add https://github.com/apache/cordova-plugin-file-transfer#r0.4.2
Tal vez tarde pero lo he arreglado.
En mi archivo de vista que utilizo:
<input id="file" name="file" type="file" onchange="angular.element(this).scope().addFile(this)" class="upload" accept="image/*" capture="camera"/>
así que dispara $scope.addFile()
de mi controlador tan pronto como recoja el archivo de la galería:
$scope.addFile = function(item){ function uploadComplete(evt) { /* This event is raised when the server send back a response */ $scope.imgId = JSON.parse(evt.target.responseText).data; $scope.$apply(); $http.post($rootScope.baseServerUrl + 'Members/changeAvatar', {attachment_id: $scope.imgId}).success( function (response){ console.log(response); $scope.User.attachment_id = $scope.imgId; $scope.$apply(); }); } function uploadFailed(evt) { alert("There was an error attempting to upload the file.") }; var updateImage = function (element) { $scope.$apply(function() { $scope.theFile = element.files[0]; var formData = new FormData(); formData.append("file", $scope.theFile); var xhr = new XMLHttpRequest() xhr.addEventListener("load", uploadComplete, false) xhr.addEventListener("error", uploadFailed, false) xhr.open("POST", $scope.baseServerUrl + "media/Attachments/add") xhr.setRequestHeader("Accept","application/json") $scope.progressVisible = true xhr.send(formData); }); }; updateImage(item) }
Funciona para todos los dispositivos Android que he probado, por encima de 4.0, excluyendo 4.4 debido al input type="file" bug
de input type="file" bug
, funciona en el simulador de iOS y dispositivos con el sistema 8.1 (también debería ser más antiguo pero no lo probé).
No es una solución perfecta, ya que sólo puede utilizar imágenes que ya tiene en su teléfono. No pude entender cómo usar Cordova FileTransfer con nuestra forma de autenticación de servidor: Siempre estaba recibiendo "por favor iniciar sesión" en respuesta, incluso cuando intenté agregar todos los encabezados necesarios, fichas, cualquier cosa …
Así que aunque esta solución está lejos de lo que quería lograr, funciona. Espero que ayude a cualquiera.
- Compatible en lenovo a369i
- El fondo de Button dibujable (forma) no se mostrará a menos que la API de la aplicación sea 20+ (Android L)