1
  • 我们有一个记录音频的应用程序,它使用了 PhoneGap 媒体 API,在 iOS 的情况下是文件 API。
  • 当用户单击Accept & Upload按钮时,应用程序使用 PhoneGap 的 File.FileTransfer() 方法将该文件移动到服务器。
  • 适用于iOS,Android不太好。
  • 当我将我的 Android 设备连接到我的计算机并安装为驱动器时,我可以看到该文件正在根目录中创建,这正是它应该在的位置。
  • 创建音频文件后,我可以从存储在全局变量fullRecordPathwhich =中的位置在我的设备上播放文件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);
}

感谢您的关注。

4

2 回答 2

1

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

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

使这项工作:

我使用 File 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);
});
于 2012-11-07T17:25:34.047 回答
0

在android上,你需要解决FileSystem

window.resolveLocalFileSystemURI(FILEURI, function(msg){
// success call msg.fullPath
}, function(){
// FAIL
});
于 2012-11-07T16:43:23.140 回答