PhoneGap: esecuzione di file sonori multipiattaforma

Creato il 01 marzo 2012 da Andreafortuna @AndyF

Lavorando con PhoneGap mi sono imbattuto in un problema singolare: cercando di avviare l’esecuzione di un file .Mp3 locale utilizzando le API del framework, lo stesso codice funzionava correttamente su iOS ma non veniva eseguito su Android.

Il sorgente era una cosa del genere:

var audiosource = "/file.mp3";
mp3file = new Media(audiosource,
function() {
   alert("playAudio():Audio Success");
},
function(err) {
   alert(err);
});
mp3file.play({numberOfLoops:1});

Il problema sembra risiedere nel differente modo di interpretare i path sulle due piattaforme: iOS considera come root del progetto la cartella /assets/www/, mentre con Android parte dalla root del progetto, rimappando la cartella /assets/ in /android_assets/.

La soluzione è quindi quella di realizzare una semplice funzione che permetterà di trasportare il codice tra le due piattaforme senza modifiche:

function playAudio(filename) {
        var audiosource = filename;
        if (device.platform == "Android") {
            audiosource="/android_asset/www/" + filename;
        }

        mp3file = new Media(audiosource,
                            function() {
                            //alert("playAudio():Audio Success");
                            },
                            function(err) {
                            alert(err);
                            }
                            );
        mp3file.play({numberOfLoops:1});
    }

Semplicemente verifica la piattaforma sulla quale sta girando l’app e ‘rimappa’ i path di conseguenza.

L’utilizzo è semplicissimo: una volta copiato il file audio nella cartella /assets/www/, lo si manda in play con:

    playAudio("NOMEFILE.mp3");