2010-08-20 14 views
14

Estoy teniendo problemas para usar el objeto MediaPlayer y no tengo mucho éxito. Si agrego un activo de sonido a mi carpeta sin formato y lo llamo usando el valor int dentro de R, funciona bien. Pero quiero poder sacar cosas de la url.MediaPlayer.setDataSource() y prepare() no funciona - android

De acuerdo con toda la documentación que he leído setDataSource() debería aceptar un parámetro de cadena con una url en un archivo.

Sigo recibiendo una excepción IO en la instrucción prepare(). Incluso intenté copiar el archivo de forma local y aún no hay dados.

¿Alguien tiene alguna 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(); 
    } 

Respuesta

20

Trate MediaPlayer.create(), es posible que también desea comenzar sólo después de reproductor esté lista, por ejemplo:

@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

Funciona muy bien con URL externas (por ejemplo, "http://google.com/") pero arroja una excepción al probar activos locales (por ejemplo, "file: //android_asset/sound.mp3") :( – richtaur

+1

@richtaur ¿Qué hace que uses los recursos de Android en lugar de los recursos regulares? MediaPlaye.create (Context context, int resid) debería funcionar muy bien para los archivos de medios internos de la aplicación. –

+0

Simplemente haría que mis cosas estuvieran más organizadas :) La carpeta Resources es lo suficientemente buena. – richtaur

12

Para corrientes, debe llamar prepareAsync(), que devuelve inmediatamente, en lugar que bloquear hasta que se hayan almacenado suficientes datos.