Cordova fileTransfer在iOS上运行完美,在Android上抛出错误代码=1

Cordova fileTransfer在iOS上运行完美,在Android上抛出错误代码=1,android,ios,cordova,ios-simulator,ionic-framework,Android,Ios,Cordova,Ios Simulator,Ionic Framework,我正在使用Cordova和Ionic框架为iOS和Android开发一个移动应用程序。需要有“发送照片”和相关功能,我正在使用Cordova的FileTransfer来实现这一点 它可以在iOS模拟器上完美运行,但在Android设备上抛出“错误代码=1” 我知道这意味着未找到文件或类似文件 请注意,如果我从相机中拍照,或从“多媒体资料”中选择一张,就会发生这种情况 这是我的密码: $scope.takePic = function() { var options = {

我正在使用Cordova和Ionic框架为iOS和Android开发一个移动应用程序。需要有“发送照片”和相关功能,我正在使用Cordova的FileTransfer来实现这一点

它可以在iOS模拟器上完美运行,但在Android设备上抛出“错误代码=1”

我知道这意味着未找到
文件
或类似文件

请注意,如果我从相机中拍照,或从“多媒体资料”中选择一张,就会发生这种情况

这是我的密码:

$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
send
。有很多警报和控制台,因为我试图找到它不起作用的原因

在android上从图库中挑选图片后,我得到:

file:///storage/sdcard0/download/file-name.jpg

在iOS模拟器上:

file:///Users//Library/Application%20Support/iPhone%20Simulator/7.1/Applications/B5FB2081-54E7-4335-8856-84C6499E6B07/tmp/cdv_photo_038.jpg

通过使用此路径,我可以使用
显示此图片,这在两种平台上都适用

但如果我尝试在Android设备上发送,我会得到错误代码=1。在iOS sim卡上,它发送、拍照、获得正确响应、更改化身……一切


Cordova和插件文件和文件传输都是最新的。

看起来您可能有路径错误,
file:///storage.sdcard0/download/file-name.jpg
应该是
file:///storage/sdcard0/download/file-name.jpg
如果我没弄错的话

通过仔细阅读您的代码,您似乎没有错误地解析任何内容。如果文件插件返回错误的URI(或者提交错误报告),您可能想尝试使用更旧、更稳定的文件插件版本?自从他们发布1.0以来,我就没有使用过这个文件插件,但从个人经验来看,以前的最新版本中有一些bug/倒退

您可以使用
@
cordova plugin add org.apache.cordova一样,从cordova cli瞄准特定的插件版本。file@1.0.0


以及使用
#
cordova插件添加一样从github发布的特定标记/版本https://github.com/apache/cordova-plugin-file-transfer#r0.4.2

可能晚了,但我已经把它修好了

在我的视图文件中,我使用:

<input id="file" name="file" type="file" onchange="angular.element(this).scope().addFile(this)" class="upload" accept="image/*" capture="camera"/>
适用于我测试过的所有Android设备,4.0以上,不包括4.4,因为
input type=“file”bug
,适用于iOS模拟器和带有8.1系统的设备(应该也适用于较旧的设备,但我没有测试)

这不是一个完美的解决方案,因为你只能使用手机上已有的图片。我不知道如何将Cordova FileTransfer与我们的服务器身份验证方式结合使用:我总是得到“请登录”的响应,即使我尝试添加所有需要的头、令牌或任何东西


因此,尽管这个解决方案远远不是我想要实现的,但它是有效的。希望它能帮助任何人。

只是
错误代码=1
?logcat或console中没有提供更多提示?我有完全相同的问题,只有另一种方式。我可以用android上传图像,而不是iOS。只获取错误代码1,我知道这是一个文件未找到的代码。感谢您的回复,此路径错误是一个输入错误:)但我一定会尝试检查较旧的插件版本哦,哈哈,我只是想这可以很容易地解释文件未找到的错误:)嗨,我有同样的问题,所以我想知道你最终不得不切换到angular.js,而不是使用cordova文件传输??是的,正如你在上面看到的,纯JavaScript+angular.js,它的代码正是我用来让它工作的
$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)
    }