Android: Inicio de una actividad para una aplicación de terceros diferente

3 minutos de lectura

Estoy trabajando en una aplicación y quiero integrar la aplicación Last.fm en ella. Básicamente, cuando alguien mira a un artista en mi aplicación, me gustaría tener un botón que puedan tocar para abrir la aplicación Last.fm con la información del artista.

Esta intención funciona, pero carga un menú que pregunta qué aplicación me gustaría usar (navegador o Last.fm):

Intent i = new Intent();
i.setData(Uri.parse("http://last.fm/music/" + headliner));
i.setAction("android.intent.action.VIEW");
startActivity(i);

Sin embargo, solo quiero iniciar la aplicación Last.fm y omitir el cuadro de diálogo que pregunta qué aplicación usar, pensé que tal vez usar el método setPackage() funcionaría así:

i.setPackage("fm.last.android");

Pero hace que la aplicación se bloquee:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://last.fm/music/Rihanna pkg=fm.last.android }

¿Es posible simplemente iniciar la aplicación Last.fm? Aquí está una copia de AndroidManifest.xml de Last.fm como referencia.

Gracias por leer, Tony

Android Inicio de una actividad para una aplicacion de terceros
Mathias Conrado

Sí, es posible, pero necesita saber el nombre correcto del componente. Inicie la aplicación last.fm regularmente y verifique el archivo de registro para la información cmp=… que se usó cuando se inició la aplicación. Use esto también en su aplicación entonces.

Inicio la aplicación Z-DeviceTest desde el mercado desde mi aplicación sin un problema como este:

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new  ComponentName("zausan.zdevicetest","zausan.zdevicetest.zdevicetest"));
startActivity(intentDeviceTest);

en mi caso, la información que tomé del logcat fue:

// dat=contenido://aplicaciones/aplicaciones/zausan.zdevicetest/zausan.zdevicetest.zdevicetest

// cmp=zausan.zdevicetest/.zdevicetest

para saber cómo iniciar la aplicación con el componente/clase correcto… haga lo mismo con la aplicación last.fm

Editar:
Probé para iniciar Last.fm desde mi propia aplicación, y esto funciona bien sin ningún error:

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new ComponentName("fm.last.android","fm.last.android.LastFm"));
startActivity(intentDeviceTest);

  • Este es un truco y no se considera la forma correcta de llamar a las aplicaciones. Esta es una forma segura de asegurarse de que aparecerán todo tipo de errores.

    – Falmarri

    19 ago.

  • ¿Puedes explicar por qué esto es un truco? ¿Está utilizando la intención normal de la aplicación que también ha llamado el iniciador de aplicaciones, es decir, cuando hace clic en el icono de la aplicación en la pantalla de inicio? De todos modos, entonces, ¿cuál es la forma correcta que sugeriría en su lugar?

    – Mathias Conradt

    19 ago. 10 a las 12:50


  • Tal vez entendí mal. Si está llamando a la actividad que llama el iniciador, entonces supongo que debería estar bien. Entendí la pregunta como llamar a una actividad INTERNA de un paquete diferente. Esto es propenso a romperse porque esa actividad podría requerir extras de intención que podrían causar un bloqueo, o algo así. Sin ver el código, no es posible saber si es 100% seguro

    – Falmarri

    19 ago.

  • @Brent Foust, los documentos realmente recomiendan hacer if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } para evitar la excepción ActivityNotFound.

    – El marciano

    19 nov.


  • @The_Martian eso también suena bien. En cuanto a la forma “recomendada” de Android, puede ser bastante complicado leer todo ese manejo de errores, solo para iniciar una actividad. si el caso común es que tendrá éxito, try/catch lee un poco más limpio. +1 por la mención de esta alternativa.

    –Brent Fausto

    19 nov.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad