【问题标题】:PhoneGap attempting to upload audio media file - works iOS, file cannot be found AndroidPhoneGap 尝试上传音频媒体文件 - 适用于 iOS,Android 找不到文件
【发布时间】:2012-11-07 16:05:03
【问题描述】:
  • 我们有一个使用 PhoneGap Media API 以及 iOS 的 File API 来录制音频的应用程序。
  • 当用户单击Accept & Upload 按钮时,应用程序会使用 PhoneGap 的 File.FileTransfer() 方法将该文件移动到服务器。
  • 适用于 iOS,Android 则不太适用。
  • 当我将 Android 设备连接到计算机并安装为驱动器时,我可以看到文件正在根目录中创建,而这正是它应该在的位置。
  • 创建音频文件后,我可以从存储在全局变量fullRecordPath which = recording.wav 中的位置在我的设备上播放文件
  • 当我尝试将 File.FileTransfer() 指向该路径时,我得到了错误代码 = 1,据我了解 找不到文件

处理接受和上传点击事件的代码:

$('#btnAcceptUpload').live('tap',function () {

    if(isIOS){
        thisFileToUpload = fullRecordPath;
    } else {
        // thisFileToUpload = './'+fullRecordPath;          //doesn't work
        // thisFileToUpload = 'file:///'+fullRecordPath;    //doesn't work
        thisFileToUpload = fullRecordPath;                  //doesn't work
    }

    var options = new FileUploadOptions();

    msg = '';
    options.fileKey="file";

    msg += "options.fileKey = "+options.fileKey+"\n";
    options.fileName=thisFileToUpload.substr(thisFileToUpload.lastIndexOf('/')+1);

    msg += "options.fileName = "+options.fileName+"\n";
    options.mimeType='audio/wav';

    options.chunkedMode = false;

    msg += "options.mimeType = "+options.mimeType+"\n";
    msg += "thisFileToUpload = "+thisFileToUpload;

    alert(msg);

    var ft = new FileTransfer();
    ft.upload(thisFileToUpload, "http://10.0.17.121/~email/ttmovefiles.php", fileUploadSuccess, fileUploadFailure, options);
});

成功回调:

function fileUploadSuccess(r) {
    console.log("Code = " + r.responseCode);
    console.log("Response = " + r.response);
    console.log("Sent = " + r.bytesSent);
    alert(r.response);
}

失败回调:

function fileUploadFailure(error){
    alert("An error has occurred: Code = " + error.code);
}

感谢收看。

【问题讨论】:

  • 什么是 Android 上的 fullRecordPath?
  • Simon,为了在设备上播放音频,它是recording.wav。上传的目的是file:///mnt/sdcard/recording.wav

标签: javascript jquery cordova jquery-mobile


【解决方案1】:

好的,好的。我想出了这个。我保证我稍后会回来并收紧这个,但我想把它记录下来,这样我就可以结束帮助另一个人了。

  • 在iOS中创建一个新的媒体你别无选择,你必须使用File api。文件系统中这个完全限定的位置被移到同一个全局变量中,Media.play() 方法在 iOS 中可以很好地发挥作用。
  • 不知道为什么它会这样工作,但是对于 Android,Media.play() 不喜欢传递给它的完全限定路径。它只需要文件名,而且显然是从根目录搜索。
  • File.FileTransfer.upload() 始终希望上传资产的完全限定路径,无论 iOS 还是 Android。

使这项工作:

我使用文件 API 创建了音频媒体然后用来将录音移入的文件。我设置了2个全局变量:一个用于在设备上播放音频fullRecordPath,另一个用于上传fullUploadPath

这是创建文件、调用媒体 API 并设置 Android 所需的全局变量的函数:

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){

    fileSystem.root.getFile(recordFileName, {
        create: true,
        exclusive: false
    }, function(fileEntry){
        alert("---------> Android File " + recordFileName + " created at " + fileEntry.fullPath);
        fullRecordPath = recordFileName;
        fullUploadPath = fileEntry.fullPath;
        mediaVar = new Media(recordFileName, function(){
            alert("Android media created successfully");
        }, androidMediaCreateFailure, mediaStatusCallback); //of new Media
        onMediaCreated();
    }, androidMediaCreateFailure); //of getFile
}, androidMediaCreateFailure); //of requestFileSystem

这是播放该媒体的代码

function playAudio() {
    var my_media = new Media(fullRecordPath,

        // success callback
        function () {
            console.log("playAudio():Audio Success");
        },

        // error callback
        function (err) {
            console.log("playAudio():Audio Error: " + err.code);
            exposeObject(err);
        });

    my_media.play();
}

这是要上传的代码

$('#btnAcceptUpload').live('tap',function () {

    if(isIOS){
        thisfullUploadPath = fullRecordPath;
    } else {
        thisfullUploadPath = fullUploadPath;
    }

    var options = new FileUploadOptions();

    msg = '';
    options.fileKey="file";

    msg += "options.fileKey = "+options.fileKey+"\n";
    options.fileName=thisfullUploadPath.substr(thisfullUploadPath.lastIndexOf('/')+1);

    msg += "options.fileName = "+options.fileName+"\n";
    options.mimeType='audio/wav';

    options.chunkedMode = false;

    msg += "options.mimeType = "+options.mimeType+"\n";
    msg += "thisfullUploadPath = "+thisfullUploadPath;

    alert(msg);

    var ft = new FileTransfer();
    ft.upload(thisfullUploadPath, "http://10.0.17.121/~email/ttmovefiles.php", fileUploadSuccess, fileUploadFailure, options);
});

【讨论】:

    【解决方案2】:

    在安卓上你需要解析文件系统

    window.resolveLocalFileSystemURI(FILEURI, function(msg){
    // success call msg.fullPath
    }, function(){
    // FAIL
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多