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:

[sourcecode lang="java"]

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

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:

[sourcecode lang="java"]
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});
}
[/sourcecode]

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:

[sourcecode lang="java"]
playAudio("NOMEFILE.mp3");
[/sourcecode]