Abra otra aplicación desde su propio (intento)

136

Sé cómo actualizar mis propios programas, y sé cómo abrir programas usando un Uri predefinido (por ejemplo, sms o correo electrónico)

Necesito saber cómo puedo crear una intención para abrir MyTracks o cualquier otra aplicación que no sé qué intenciones escuchan.

Recibí esta información de DDMS, pero no he tenido éxito en convertir esto en una intención que pueda usar. Esto se toma al abrir MyTracks manualmente.

Gracias por tu ayuda

05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)
AndersWid
fuente

Respuestas:

141

En primer lugar, el concepto de "aplicación" en Android es ligeramente extendido.

Una aplicación, técnicamente un proceso, puede tener múltiples actividades, servicios, proveedores de contenido y / o radiodifusores. Si al menos uno de ellos se está ejecutando, la aplicación está en funcionamiento (el proceso).

Entonces, lo que debe identificar es cómo desea "iniciar la aplicación".

Ok ... esto es lo que puedes probar:

  1. Crea una intención con action=MAINycategory=LAUNCHER
  2. Obtenga el PackageManagerdel contexto actual usandocontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)donde la intención ha sido category=LAUNCHER, action=MAINo packageManager.resolveActivity(<intent>, 0)para obtener la primera actividad con main / launcher
  4. Obtenga lo ActivityInfoque le interesa
  5. Desde el ActivityInfo, obtener el packageNameyname
  6. Por último, crear otra intención con con category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)ysetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Finalmente, context.startActivity(newIntent)
Gaurav Vaish
fuente
¿Qué pasa si quisiera abrir tres aplicaciones separadas?
Si8
77
La respuesta wiki de la comunidad a continuación es mejor, si conoce el nombre del paquete stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk
¿Cómo puede pasar datos entre la aplicación de llamada y la aplicación iniciada? Encontré 'Intent.putExtra ()' pero no sé cómo recuperar los datos adicionales en la aplicación iniciada.
Bram
onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc.
Gaurav Vaish el
2
getPackageManager().getLaunchIntentForPackage()ya hace todo eso por usted github.com/android/platform_frameworks_base/blob/master/core/…
jrub
231

Tengo trabajo así,

/** Open another app.
 * @param context current Context, like Activity, App, or Service
 * @param packageName the full package name of the app to open
 * @return true if likely successful, false if unsuccessful
 */
public static boolean openApp(Context context, String packageName) {
    PackageManager manager = context.getPackageManager();
    try {
        Intent i = manager.getLaunchIntentForPackage(packageName);
        if (i == null) {
            return false;
            //throw new ActivityNotFoundException();
        }
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
        return true;
    } catch (ActivityNotFoundException e) {
        return false;
    }
}

Ejemplo de uso:

openApp(this, "com.google.android.maps.mytracks");

Espero que ayude a alguien.

Anonsage
fuente
55
porque getLaunchIntentForPackage ("nombre del paquete de la aplicación") puede causar una excepción.
xtr
Esta es una gran respuesta, simplemente tome la excepción y haga lo que necesite, notifique al usuario, etc.
IT-Dan
55
No para ser riguroso, pero no hay razón para asignar un nuevo Intento en la primera línea dado que usa el resultado de la getLaunchIntentForPackagellamada.
Chris Lacy
2
getLaunchIntentForPackage()ya agrega la categoría, ver fuente: github.com/android/platform_frameworks_base/blob/master/core/…
jrub
96
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(intent);

EDITAR:

como se sugiere en los comentarios, agregue una línea antes startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
zawhtut
fuente
18
pero requiere saber el nombre de la actividad
njzk2
Intenté esto y recibí un error al recomendar usar el indicador FLAG_ACTIVITY_NEW_TASK Agregué esta línea antes de startActivity y funcionó: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze
1
@ njzk2 encontrar el nombre del paquete para algo en Google Play es fácil; está justo ahí en la URL. Por ejemplo: play.google.com/store/apps/…
Da-Jin
@iceybobby sí, el nombre del paquete es fácil de encontrar, pero ¿cómo encuentra el nombre de la clase de la actividad para iniciar?
phreakhead
@phreakhead Tienes razón. Creo que utilicé la solución en esta respuesta: stackoverflow.com/a/8944286/1224186, por lo que el nombre de la actividad no era necesario, y creo que eso hace que mi respuesta a njzk2 sea inútil aquí.
Da-Jin
39

Si ya tiene el nombre del paquete que desea activar, puede usar el siguiente código, que es un poco más genérico:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}

Descubrí que funciona mejor para los casos en que la actividad principal no se encontró mediante el método regular para iniciar la actividad PRINCIPAL.

Muzikant
fuente
La mejor respuesta para mí :-) útil para mí. Gracias
Jalpesh Khakhi
Es perfecto para mí. Muchas gracias Muzikant:)
Alex
13

Este es el código de mi base de solución en la solución MasterGaurav:

private void  launchComponent(String packageName, String name){
    Intent launch_intent = new Intent("android.intent.action.MAIN");
    launch_intent.addCategory("android.intent.category.LAUNCHER");
    launch_intent.setComponent(new ComponentName(packageName, name));
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    activity.startActivity(launch_intent);
}

public void startApplication(String application_name){
    try{
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info:resolveinfo_list){
            if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                break;
            }
        }
    }
    catch (ActivityNotFoundException e) {
        Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
    }
}
inversus
fuente
10

Usando la solución de inversus, expandí el fragmento con una función, que se llamará cuando la aplicación deseada no esté instalada en este momento. Entonces funciona como: Ejecutar aplicación por nombre de paquete. Si no se encuentra, abra Android Market: Google Play para este paquete .

public void startApplication(String packageName)
{
    try
    {
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info : resolveInfoList)
            if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
            {
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                return;
            }

        // No match, so application is not installed
        showInMarket(packageName);
    }
    catch (Exception e) 
    {
        showInMarket(packageName);
    }
}

private void launchComponent(String packageName, String name)
{
    Intent intent = new Intent("android.intent.action.MAIN");
    intent.addCategory("android.intent.category.LAUNCHER");
    intent.setComponent(new ComponentName(packageName, name));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    startActivity(intent);
}

private void showInMarket(String packageName)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Y se usa así:

startApplication("org.teepee.bazant");
peter.bartos
fuente
6

Utilizar este :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Swetha
fuente
¿Tienes alguna idea? abra un test.apk en lugar de instalarlo en la tienda de dispositivos dentro de la aplicación existente. sugerencias al hacer clic en un botón de almuerzo test.apk aplicaciones que se almacenaron en el proyecto existente. gracias de antemano.
Selim Raza
6

Abra la aplicación si existe, o abra la aplicación Play Store para instalarla:

private void open() {
    openApplication(getActivity(), "com.app.package.here");
}

public void openApplication(Context context, String packageN) {
    Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
    if (i != null) {
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
        }
        catch (android.content.ActivityNotFoundException anfe) {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
        }
    }
}
Flinbor
fuente
debería ser si (i! = null)
vallllll
4

Para iniciar otra actividad de la aplicación desde la actividad de mi aplicación. Está funcionando bien para mí.

El siguiente código funcionará si la otra aplicación ya está instalada en su teléfono; de lo contrario, no es posible redirigir una aplicación a otra. Por lo tanto, asegúrese de que su aplicación se haya iniciado o no.

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
KCN
fuente
No escriba múltiples respuestas que sean casi idénticas a la misma pregunta. Use el enlace "editar" debajo de la respuesta y cambie el original.
AdrianHHH
3

// Esto funciona en Android Lollipop 5.0.2

public static boolean launchApp(Context context, String packageName) {

    final PackageManager manager = context.getPackageManager();
    final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
    appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
    if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
        for (ResolveInfo rInfo : resolveInfos) {
            String className = rInfo.activityInfo.name.trim();
            String targetPackageName = rInfo.activityInfo.packageName.trim();
            Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
            if (packageName.trim().equals(targetPackageName)) {
                Intent intent = new Intent();
                intent.setClassName(targetPackageName, className);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
                return true;
            }
        }
    }
    return false;
}
Anil Kongovi
fuente
2

Dado que las aplicaciones no pueden cambiar muchas de las configuraciones del teléfono, puede abrir una actividad de configuración al igual que otra aplicación.

Mire su salida de LogCat después de haber modificado la configuración manualmente:

INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924

Luego, use esto para mostrar la página de configuración de su aplicación:

String SettingsPage = "com.android.settings/.DevelopmentSettings";

try
{
Intent intent = new Intent(Intent.ACTION_MAIN);             
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));             
intent.addCategory(Intent.CATEGORY_LAUNCHER );             
startActivity(intent); 
}
catch (ActivityNotFoundException e)
{
 log it
}
Tary
fuente
2

Para API nivel 3+, nada más que una línea de código:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

Devuelva un intento de lanzamiento de CATEGORY_INFO (las aplicaciones sin actividad de iniciador, los fondos de pantalla, por ejemplo, a menudo usan esto para proporcionar información sobre la aplicación) y, si no la encuentra, devuelve el CATEGORY_LAUNCH del paquete, si existe.

Renascienza
fuente
2

Si está intentando iniciar un SERVICIO en lugar de una actividad, esto funcionó para mí:

Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);

Si utiliza el método intent.setComponent (...) como se menciona en otras respuestas, puede obtener una advertencia "Los intentos implícitos con startService no son seguros".

Dunc
fuente
2

Alternativamente, también puede abrir la intención desde su aplicación en la otra aplicación con:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

¿Dónde uriestá el enlace profundo a la otra aplicación?

electrobabe
fuente
2

Use lo siguiente:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
Lurzapps
fuente
2

Iniciar una aplicación desde otra aplicación en Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
Ashutosh Srivastava
fuente
2

Si desea abrir otra aplicación y no está instalada, puede enviarla a Google App Store para descargarla.

  1. Primero cree el método openOtherApp por ejemplo

    public static boolean openOtherApp(Context context, String packageName) {
        PackageManager manager = context.getPackageManager();
         try {
            Intent intent = manager.getLaunchIntentForPackage(packageName);
            if (intent == null) {
                //the app is not installed
                try {
                    intent = new Intent(Intent.ACTION_VIEW);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setData(Uri.parse("market://details?id=" + packageName));
                    context.startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    //throw new ActivityNotFoundException();
                    return false;
                }
    
             }
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             context.startActivity(intent);
             return true;
        } catch (ActivityNotFoundException e) {
            return false;
        }
    
    }

2.- Uso

openOtherApp(getApplicationContext(), "com.packageappname");
Vladimir Salguero
fuente
0

Prueba este código, espero que esto te ayude. Si este paquete está disponible, se abrirá la aplicación o se abrirá Play Store para descargas

    String  packageN = "aman4india.com.pincodedirectory";

            Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
            if (i != null) {
                i.addCategory(Intent.CATEGORY_LAUNCHER);
                startActivity(i);
            } else {
                try {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
                }
                catch (android.content.ActivityNotFoundException anfe) {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
                }
            }
AMAN SINGH
fuente
-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
Manzer
fuente