|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Crasheo de aplicacion en MediaMetadataRetriever
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: Código:
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(MediaMetadataRetriever.METADATA_KEY_TITLE);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
out += "\n";
out += metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);
out += "\n";
// convert duration to minute:seconds
String duration = metaRetriever.extractMetadata(MediaMetadataRetriever.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);
Gracias de antemano Última edición por berto1989 Día 09/06/13 a las 13:44:36. |
|
|
|
#3
|
||||
|
||||
|
Lo estoy haciendo dentro de
Código:
protected void onCreate(Bundle savedInstanceState) {
final ImageView info_cancion = (ImageView) findViewById(R.id.info);
info_cancion.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
|
|
#4
|
||||
|
||||
|
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.
__________________
|
|
#5
|
||||
|
||||
|
Estos son los errores que me da al crashear
Código:
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.java: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$MethodAndArgsCaller.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) |
|
#6
|
||||
|
||||
|
El sistema no puede abrir la dirección web que has puesto.
¿Le has dado a tu app permisos para que acceda a Internet? |
|
#7
|
||||
|
||||
|
Si, en el manifiest
Código:
<uses-permission android:name="android.permission.INTERNET" /> |
|
#8
|
||||
|
||||
|
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/is...etail?id=35794
__________________
|
|
#9
|
||||
|
||||
|
Buenas, compilando en 4.0 me sigue dando error
Con el: Cita:if (Build.VERSION.SDK_INT >= 14)
mmr.setDataSource(link, new HashMap<String, String>()); else mmr.setDataSource(link); ![]() Cita:out += metaRetriever.extractMetadata(MediaMetadataRetriev er.METADATA_KEY_TITLE);
![]() Con un archivo .mp3 directo funciona perfectamente Última edición por berto1989 Día 07/06/13 a las 20:06:39. |
|
#10
|
||||
|
||||
|
Mirando un poco mas he visto esto que no se si te servira como ultimo remedio http://stackoverflow.com/questions/1...31728#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/1...-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.
__________________
|
|
#11
|
||||
|
||||
|
Buenas, devolver devuelve una pagina, si le pongo el link directo al .pls crashea la aplicación.
Código:
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._setDataSource(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.java: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$MethodAndArgsCaller.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 : http://stackoverflow.com/questions/8...g-online-radio |
|
#12
|
||||
|
||||
|
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.
__________________
|
|
#13
|
||||
|
||||
|
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/s...adata-example |
|
#14
|
||||
|
||||
|
Buenas, con el ultimo link que puse e ido probando y donde parece que no me lee es aki
Código:
public void OnMetadataChanged(Metadata item) {
artistName = item.artist;
trackName = item.track;
tab3.setText("Artista: " + artistName + "\nCanción: " + trackName);
updateMeta();
}
edito: solucionado Última edición por berto1989 Día 09/06/13 a las 13:45:30. |
![]() |
Estás aquí
|
||||||
|
||||||