2011-08-30 15 views
8

Sto provando a utilizzare lo stesso lettore multimediale ma a modificare l'origine dati. Qui è quello che sto cercando di fare:  Modifica dell'origine dati per la riproduzione audio utilizzando MediaPlayer esistente?

private MediaPlayer mMediaPlayer; 

    public void pickFile1() { 
     initMediaPlayer("myfile1.mp3"); 
    } 

    public void pickFile2() { 
     initMediaPlayer("myfile2.mp3"); 
    } 

    private void initMediaPlayer(String mediafile) { 
    // Setup media player, but don't start until user clicks button! 
    try { 
     if (mMediaPlayer == null) { 
      mMediaPlayer = new MediaPlayer(); 
     } else { 
      mMediaPlayer.reset(); // so can change data source etc. 
     } 
     mMediaPlayer.setOnErrorListener(this); 
     AssetFileDescriptor afd = getAssets().openFd(mediafile); 
     mMediaPlayer.setDataSource(afd.getFileDescriptor()); 
    } 
    catch (IllegalStateException e) { 
     Log.d(TAG, "IllegalStateException: " + e.getMessage()); 
    } 
    catch (IOException e) { 
     Log.d(TAG, "IOException: " + e.getMessage()); 
    } 
    catch (IllegalArgumentException e) { 
     Log.d(TAG, "IllegalArgumentException: " + e.getMessage()); 
    } 
    catch (SecurityException e) { 
     Log.d(TAG, "SecurityException: " + e.getMessage()); 
    } 

    mMediaPlayer.setOnPreparedListener(this); 
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread 
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); // Keep playing when screen goes off! 
} 

Ho appena chiamo questo quando voglio passare ad un nuovo Mediafile. Tuttavia, sembra che non cambi la fonte dei dati. Prima domanda: è possibile farlo in questo modo, o devo rilasciare il lettore multimediale e crearne uno nuovo per ogni nuovo file? Se è possibile, allora perché il mio codice non funziona correttamente?

Edit: bene, rilasciando e ricreare il lettore multimediale non sta facendo neanche! Continua a suonare la stessa canzone!?!? Com'è possibile? Nuova idea: creare un lettore multimediale diverso per ogni traccia, è davvero quello che devo fare qui? Forse questo è un bug in Android?

risposta

0

Beh, non ho mai avuto una risposta davvero buona per questo. Penso che potrebbe essere qualcosa di divertente che accade nell'emulatore. Quello che ho fatto è un ottimo lavoro per me, è quello di scaricare i file sulla scheda SD esterna e riprodurli da lì. Questo cambia un po 'il codice a questo:

String path = getExternalFilesDir(null).toString() + "/"; 
mMediaPlayer.setDataSource(path + mediafile); 

il resto rimane la stessa.

0

Si dichiara private String mediafile="my.mp3"; quindi si utilizza AssetFileDescriptor afd = getAssets().openFd(mediafile); ma in nessun punto (dal codice inviato) si modifica il valore di mediafile.
Si consiglia di inserire mediafile = theNextFile; sulla linea prima dello afd = getAssets().openFd(mediafile); dove theNextFile probabilmente si riferisce a un file sulla scheda SD che l'utente ha scelto prima di fare clic su detto pulsante.
Non sono sicuro di come ottenere i nomi dei file dalla scheda SD, ma penso che l'utilizzo di startActivityForResult sia un modo per farlo.

+0

Sì hai ragione, non ho incluso quella parte dal mio codice, quindi il mio campione è difettoso. Aggiornerò di conseguenza - sfortunatamente non è questo il motivo per cui il mio codice non funziona. Ho verificato con il debugger che il file multimediale ha un nome file diverso, anche se il file originale continua a essere riprodotto.Nel mio caso, il file è incluso nella cartella delle risorse, quindi posso accedere come mostrato nel mio codice. –

2

Oggi ho avuto questo stesso problema con le risorse e conosco la soluzione.

Il problema è che i beni sono memorizzati come un unico grande blocco di dati piuttosto che in realtà come un insieme di singoli file su un sistema di file reale da qualche parte. Quindi, quando ottieni uno assetfiledescriptor, punta sia a un file, ma ha anche un offset e una lunghezza. Se si punta semplicemente mediaplayer allo stesso assetfiledescriptor, viene sempre riprodotto il primo file multimediale nella cartella delle risorse (o qualcosa del genere).

Se si esegue questa operazione: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

allora gioca il file giusto.

+0

Molto interessante, quando ho una possibilità ho intenzione di dare il tuo suggerimento una prova! Non l'avevo mai sentito parlare di risorse: potresti inserire un link a un po 'di documentazione rilevante a riguardo? Grazie! –

7

Assicurarsi di arrestare e ripristinare il mediaplayer prima di modificare l'origine dati. Su cosa più importante quando si smette chiama

onCompletion

.. Quindi controllare cosa si sta facendo in questo metodo. Quindi chiama

mplayer.setDataSource(audioPath); 
mplayer.setOnPreparedListener(this); 
mplayer.prepareAsync(); 
Problemi correlati