2010-08-20 14 views
14

Sto avendo una brutta esperienza nell'utilizzo dell'oggetto MediaPlayer e non avendo molto successo. Se aggiungo una risorsa audio alla mia cartella raw e la chiamo utilizzando il valore int all'interno di R, funziona perfettamente. Ma voglio essere in grado di tirare fuori le cose dall'URL.MediaPlayer.setDataSource() e prepare() non funzionano - android

In base a tutta la documentazione che ho letto setDataSource() dovrebbe accettare una stringa param con un url in un file.

Continuo a ricevere un'eccezione IO nell'istruzione prepare(). Ho persino provato a copiare il file localmente e ancora nessun dado.

Qualcuno ha qualche idea?

MediaPlayer mp = new MediaPlayer(); 
try { 
     mp.setDataSource("http://www.urltofile.com/file.mp3"); 
     mp.prepare(); 
     mp.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

risposta

20

Prova MediaPlayer.create(), si può anche desidera avviare solo dopo che il giocatore è in realtà pronto, ad esempio:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MediaPlayer player = MediaPlayer.create(this, Uri.parse("http://www.urltofile.com/file.mp3")); 
    player.setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 
} 
+3

Funziona alla grande con URL esterni (ad esempio, "http://google.com/") ma genera un'eccezione durante il tentativo di risorse locali (ad esempio "file: //android_asset/sound.mp3") :( – richtaur

+1

@richtaur cosa ti fa usare le risorse di Android invece delle risorse regolari? MediaPlaye.create (Contesto di contesto, int resid) dovrebbe funzionare perfettamente per i file multimediali interni delle app. –

+0

Renderebbe le mie cose più organizzate :) La cartella delle risorse è abbastanza buona. – richtaur

12

Per i flussi, si dovrebbe chiamare prepareAsync(), che restituisce immediatamente, piuttosto di bloccare fino a quando non è stato memorizzato un numero sufficiente di dati.

Problemi correlati