1
  • PhoneGap Media API を使用し、iOS の場合は File API を使用してオーディオを録音するアプリがあります。
  • ユーザーがAccept & Uploadボタンをクリックすると、アプリは PhoneGap の File.FileTransfer() メソッドを使用して、そのファイルをサーバーに移動します。
  • iOS ではうまく機能しますが、Android ではあまり機能しません。
  • Android デバイスをコンピューターに接続し、ドライブとしてマウントすると、ファイルが本来あるべき場所であるルートに作成されていることがわかります。
  • オーディオ ファイルが作成された後、グローバル変数fullRecordPathに保存されている場所からデバイスでファイルを再生できます。recording.wav
  • File.FileTransfer() をそのパスに向けようとすると、エラーコード = 1 が表示されますが、これはFile Not Foundであると理解しています

Accept & Uploadタップ イベントを処理するコード:

$('#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では、選択の余地のない新しいメディアを作成するには、ファイルAPIを使用する必要があります。ファイルシステム内のこの同じ完全修飾スポットは、iOSでMedia.play()メソッドがうまく機能したのと同じグローバル変数に移動されました。
  • なぜこのように機能するのかはわかりませんが、Androidの場合、Media.play()は、渡された完全修飾パスを好みません。ファイル名が必要なだけで、明らかにルートから検索します。
  • File.FileTransfer.upload()は、iOSまたはAndroidに関係なく、常にアセットの完全修飾パスをアップロードする必要があります。

これを機能させるには:

File APIを使用して、オーディオメディアが録音の移動先として使用するファイルを作成しました。2つのグローバル変数を設定しました。1つはデバイスfullRecordPathでオーディオを再生するためのもので、もう1つはアップロードするためのもの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ではresolveFileSystemが必要です

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