PDA

Ver la Versión Completa : [ SOLUCIONADO ] Crasheo de aplicacion en MediaMetadataRetriever


berto1989
06/06/13, 20:57:51
Buenas, estoy intentando obtener el artista y la canción de una radio streaming, pero al poner el codigo y darle al boton de obtener, me crashea la aplicación.


El codigo es este:


TextView tab3 = (TextView)findViewById(R.id.textView3);

MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource("http://2xx.xxx.xx1.xxx:8xxx/");

String out = "";
// get mp3 info
out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_TITLE);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_ARTIST);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_ALBUM);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_YEAR);
out += "\n";
// convert duration to minute:seconds
String duration = metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_DURATION);
long dur = Integer.parseInt(duration);
String seconds = String.valueOf(dur % 60);
String minutes = String.valueOf(dur / 60000);
out += "Length: [ " + minutes + "m" + seconds + "s ]\n";

// close object
metaRetriever.release();
// display output
tab3.setText(out);


Alguna posible aclaración de por que me pasa esto?

Gracias de antemano

kriogeN
06/06/13, 21:16:50
¿Lo estás haciendo en el hilo principal?

Si es así tiene toda la pinta de un NetworkOnMainThreadException.

berto1989
06/06/13, 21:30:54
Lo estoy haciendo dentro de

protected void onCreate(Bundle savedInstanceState) {

final ImageView info_cancion = (ImageView) findViewById(R.id.info);

info_cancion.setOnClickListener(new OnClickListener() {


public void onClick(View view) {

set92
07/06/13, 14:32:33
Es decir en el hilo principal, porque que yo sepa el setOnClickListener no crea hilos secundarios, con lo cual es el fallo que dice kriogen, llamadas a internet se hacen siempre en hilos secundarios, pero aun asi te pondra en el LogCat el tipo de error que es.
Si no es ese mira haber que error te marca y luego copias la primera linea del error en google y te dara la solucion.

berto1989
07/06/13, 14:47:45
Estos son los errores que me da al crashear


06-07 12:44:35.754: E/Trace(23745): error opening trace file: No such file or directory (2)
06-07 12:44:52.053: E/AndroidRuntime(23745): FATAL EXCEPTION: main
06-07 12:44:52.053: E/AndroidRuntime(23745): java.lang.IllegalArgumentException
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.media.MediaMetadataRetriever.setDataSource (MediaMetadataRetriever.java:68)
06-07 12:44:52.053: E/AndroidRuntime(23745): at es.xxxx.xxxx.xxxxx.cancion(xxxxx.java:230)
06-07 12:44:52.053: E/AndroidRuntime(23745): at es.xxxx.xxxx.xxxxx$4.onClick(xxxxx.java:170)
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.view.View.performClick(View.java:4204)
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.view.View$PerformClick.run(View.java:17355 )
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.os.Handler.handleCallback(Handler.java:725 )
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.os.Handler.dispatchMessage(Handler.java:92 )
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.os.Looper.loop(Looper.java:137)
06-07 12:44:52.053: E/AndroidRuntime(23745): at android.app.ActivityThread.main(ActivityThread.jav a:5041)
06-07 12:44:52.053: E/AndroidRuntime(23745): at java.lang.reflect.Method.invokeNative(Native Method)
06-07 12:44:52.053: E/AndroidRuntime(23745): at java.lang.reflect.Method.invoke(Method.java:511)
06-07 12:44:52.053: E/AndroidRuntime(23745): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:793)
06-07 12:44:52.053: E/AndroidRuntime(23745): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:560)
06-07 12:44:52.053: E/AndroidRuntime(23745): at dalvik.system.NativeStart.main(Native Method)

kriogeN
07/06/13, 15:03:39
El sistema no puede abrir la dirección web que has puesto.

¿Le has dado a tu app permisos para que acceda a Internet?

berto1989
07/06/13, 15:19:33
Si, en el manifiest

<uses-permission
android:name="android.permission.INTERNET"
/>

set92
07/06/13, 19:18:15
intenta abrir otra direccion que sepas que va a funcionar, igual puedes probar google.es? Sino igual es el puerto o asi, pero vamos esta claro que te falla por la linea 68 y la comunicacion con esa direccion IP.

Haciendo tu trabajo y mirando por internet ahora veo que parece ser que hay un problema en la v4.1.1 y me imagino que para delante tambien en el cual da error al hacer la llamada, pero desde la 2.1 hasta la 4.0.4 si que funciona.

La forma de solucionarlo es usando setDataSource(link, headers); por lo que te quedaria algo asi
if (Build.VERSION.SDK_INT >= 14)
mmr.setDataSource(link, new HashMap<String, String>());
else
mmr.setDataSource(link);

Prueba primero a compilar la app para la version 4.0 o anterior y ver si funciona, y si funciona ya sabes cual es el problema/solucion

EDIT: Por si luego lo necesitas y no lo encuentras o no te leo https://code.google.com/p/android/issues/detail?id=35794

berto1989
07/06/13, 20:01:52
Buenas, compilando en 4.0 me sigue dando error

Con el:

if (Build.VERSION.SDK_INT >= 14)
mmr.setDataSource(link, new HashMap<String, String>());
else
mmr.setDataSource(link);


Me funciona, lo que pasa es que me devuelve null en todo


out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_TITLE);


Cabe aclarar que yo conecto con una radio streaming y que el archivo es un listen.pls


Con un archivo .mp3 directo funciona perfectamente

set92
07/06/13, 23:45:36
Mirando un poco mas he visto esto que no se si te servira como ultimo remedio http://stackoverflow.com/questions/16931555/how-to-do-streaming-with-pls-files-in-android/16931728#16931728

Aparte de eso el error imagino que sera porque no recojes por lo que sea el listen.pls, estas seguro de que esta ahi y de que es accesible por la app? Comprueba con un Log.d o lo que sea haber si de verdad contiene el .pls el metaRetriever, porque cuando haces la llamada al puerto de esa ip devuelve si o si el .pls? Si es asi no deberia haber error, pero si no devuelvo el archivo y devuelve una URL o un numero...
Aqui por ejemplo http://stackoverflow.com/questions/14437905/error-with-by-mediametadataretriever-setdatasource el error que tiene es que coje la musica de la carpeta raw y claro eso no es el archivo, es el numero de identificacion, entonces no se si a ti te estara pasando algo por el estilo.

berto1989
08/06/13, 00:00:52
Buenas, devolver devuelve una pagina, si le pongo el link directo al .pls crashea la aplicación.


06-07 21:57:57.683: E/AndroidRuntime(4777): FATAL EXCEPTION: main
06-07 21:57:57.683: E/AndroidRuntime(4777): java.lang.RuntimeException: setDataSource failed: status = 0x80000000
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.media.MediaMetadataRetriever._setDataSourc e(Native Method)
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.media.MediaMetadataRetriever.setDataSource (MediaMetadataRetriever.java:99)
06-07 21:57:57.683: E/AndroidRuntime(4777): at es.xxxxx.xxxxx.xxxxx.cancion(xxxxx.java:233)
06-07 21:57:57.683: E/AndroidRuntime(4777): at es.xxxx.xxxx.xxxxx$4.onClick(xxxxxx.java:167)
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.view.View.performClick(View.java:4204)
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.view.View$PerformClick.run(View.java:17355 )
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.os.Handler.handleCallback(Handler.java:725 )
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.os.Handler.dispatchMessage(Handler.java:92 )
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.os.Looper.loop(Looper.java:137)
06-07 21:57:57.683: E/AndroidRuntime(4777): at android.app.ActivityThread.main(ActivityThread.jav a:5041)
06-07 21:57:57.683: E/AndroidRuntime(4777): at java.lang.reflect.Method.invokeNative(Native Method)
06-07 21:57:57.683: E/AndroidRuntime(4777): at java.lang.reflect.Method.invoke(Method.java:511)
06-07 21:57:57.683: E/AndroidRuntime(4777): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:793)
06-07 21:57:57.683: E/AndroidRuntime(4777): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:560)
06-07 21:57:57.683: E/AndroidRuntime(4777): at dalvik.system.NativeStart.main(Native Method)
06-07 21:57:59.954: I/Process(4777): Sending signal. PID: 4777 SIG: 9



Yo encontre esto, pero no se por donde cogerlo xD:

http://stackoverflow.com/questions/8970548/how-to-get-metadata-of-a-streaming-online-radio

set92
08/06/13, 10:26:37
retrieveMetaData() es el metodo que te interesa a ti del link de stackoverflow, pero si lo que te devuelve es una pagina como a el es logico que no funcione porque MediaMetadataRetriever solo acepta estos tipos que haya leido
Playlist
- an .m3u, .pls, or .asx file containing links to individual audio tracks
SHOUTcast Playlist
- an .m3u, .pls, or .asx file containing links to SHOUTcast/Icecast server streams
SHOUTcast Stream
- a direct link to a SHOUTcast/Icecast server stream

Por lo que si le pasas una web tienes que sacar de la web el archivo .pls para reproducirlo que es lo que hace el chico ese con el metodo del retrieveMetadata()

Si lo pones el link directo al .pls y crashea puede que sea error como el que te decia kriogen de temas de conexion o cualquier otra cosilla tonta y que se pueda reparar facil pero seguramente sea menos seguro.

berto1989
08/06/13, 10:37:10
Ya cambiara el metodo, cuando hacen click en el boton los mando a otro public void fuera del oncreate, pero me sigue crasheando

Encontre esto:

http://androidworkz.com/2012/11/30/shoutcast-metadata-example/

berto1989
09/06/13, 11:17:49
Buenas, con el ultimo link que puse e ido probando y donde parece que no me lee es aki

public void OnMetadataChanged(Metadata item) {

artistName = item.artist;
trackName = item.track;
tab3.setText("Artista: " + artistName + "\nCanción: " + trackName);
updateMeta();

}

E ido metiendo un toastmake en cada apartado de esta zona, y aqui no se me muestra por lo que doy por echo que es ai el fallo

edito: solucionado