PhoneGap FileReader/readAsDataURL 不触发回调

Posted

技术标签:

【中文标题】PhoneGap FileReader/readAsDataURL 不触发回调【英文标题】:PhoneGap FileReader/readAsDataURL Not Triggering Callbacks 【发布时间】:2014-09-09 17:25:25 【问题描述】:

我正在使用 PhoneGap Build 构建 ios v7.1+ 应用程序并使用 weinre 进行调试。我正在使用媒体捕获插件和文件 API 来捕获视频,以尝试获取其 base64 表示。我可以让录像机打开,拍摄视频,并返回文件路径。然后我使用resolveLocalFileSystemURL() 获取readAsDataURL() 需要的文件对象。问题是FileReader 从未调用过onloadend 回调。

我整天都在闲逛。将console.log() 放在我能想到的任何地方。我检查以确保 iOS 版本is supported。每个变量都是我所期望的,但根本没有调用回调。我也尝试过设置所有其他回调,但也没有一个被调用过。我尝试用readAsText() 替换readAsDataURL(),但我仍然得到bupkis。由于我认为异步调用可能需要一点时间,但仍然没有任何反应,因此我尝试了最多等待五分钟。

下面是我的代码。下面是控制台输出。

var elements = new Object();
elements["video"] = $("#window_incident_create > .video > source")[0];

navigator.device.capture.captureVideo(
    function(files) 
        for ( var i in files ) 
            var file = files[i];

            var name = file.name;
            var path = file.fullPath;
            if ( path.indexOf("/private") === 0 )
                path = "file://" + path.substr(8);
            else
                path = "file://" + path;
            var type = file.type;
            var lastModifiedDate = file.lastModifiedDate;
            var size = file.size;

            var reader = new FileReader();
            reader.onloadend = function(event) 
                console.log(3);
                elements["video"].type = type;
                elements["video"].src = "data:" + type + ";base64," + event.target.result;
                console.log(4);
            ;

            window.resolveLocalFileSystemURL(
                path,
                function(entry) 
                    console.log(1, entry.nativeURL);
                    reader.readAsDataURL(entry);
                    console.log(2);
                ,
                function(error) 
                    console.log("0-0", error);
                
            );
        
    ,
    function(error) 
        console.log("0-1", error);
    ,
    
        limit:  1
    
);

1 "file:///var/mobile/Applications/AB239984-FB9F-43C0-B699-3596AC8A43A8/tmp/capture/capturedvideo.MOV"

2

【问题讨论】:

你有没有想过这个问题? 【参考方案1】:

稍微重新组织您的代码。将reader 初始化和onloadend 回调放在resolveLocalFileSystemURL 成功回调中。

类似这样的:

var elements = new Object();
elements["video"] = $("#window_incident_create > .video > source")[0];

navigator.device.capture.captureVideo(
    function(files) 
        for ( var i in files ) 
            var file = files[i];

            var name = file.name;
            var path = file.fullPath;
            if ( path.indexOf("/private") === 0 )
                path = "file://" + path.substr(8);
            else
                path = "file://" + path;
            var type = file.type;
            var lastModifiedDate = file.lastModifiedDate;
            var size = file.size;

            window.resolveLocalFileSystemURL(
                path,
                function(entry) 
                    console.log(1, entry.nativeURL);
                    var reader = new FileReader();
                    reader.onloadend = function(event) 
                        console.log(3);
                        elements["video"].type = type;
                        elements["video"].src = "data:" + type + ";base64," + event.target.result;
                        console.log(4);
                    ;
                    reader.readAsDataURL(entry);
                    console.log(2);
                ,
                function(error) 
                    console.log("0-0", error);
                
            );
        
    ,
    function(error) 
        console.log("0-1", error);
    ,
    
        limit:  1
    
);

【讨论】:

以上是关于PhoneGap FileReader/readAsDataURL 不触发回调的主要内容,如果未能解决你的问题,请参考以下文章

小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载一(PhoneGap中的API)

Phonegap : 浮动气泡通知,如 Phonegap 中的 facebook messenger

phonegap build + phonegap-cli + ionic 图标

PhoneGap - Android - 在 phonegap 中滑动导航

PhoneGap / Cordova 回调错误 - 在 PhoneGap 中未执行 RestKit 完成功能

Cordova/Phonegap:无法让 Facebook Phonegap 插件工作