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.

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.

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.

  • Cómo crear un Webapp para iOS, Android, BBerry, Symbian
  • Aplicaciones Android y Android de etiqueta blanca
  • Gotchas / errores en el desarrollo de WebKit en iOS o Android
  • Webrtc móvil cliente kurento
  • Android contrapartida de la advertencia de memoria iOS
  • Corriendo R's C Core Only
  • Configuración de la aplicación no: esta aplicación sigue en modo de desarrollo
  • Detectar si la página web se carga en la aplicación nativa de Facebook en iOS / Android
  • ¿Cómo tener un gradiente transparente sobre una imagen en React iOS nativo?
  • PayPal Mobile Express - "El pago no se puede realizar con un dispositivo móvil"
  • Robust React Búsqueda de elementos nativos usando Appium
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.