Apri un'altra applicazione dal tuo (intento)


136

So come aggiornare i miei programmi e so come aprire programmi usando un Uri predefinito (ad esempio per sms o e-mail)

Devo sapere come posso creare un Intento per aprire MyTracks o qualsiasi altra applicazione che non conosco quali intenti ascoltano.

Ho ricevuto queste informazioni da DDMS, ma non sono riuscito a trasformarle in un Intento che posso usare. Questo è tratto dall'apertura manuale di MyTracks.

Grazie per l'aiuto

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)

Risposte:


141

In primo luogo, il concetto di "applicazione" in Android è leggermente esteso.

Un'applicazione, tecnicamente un processo, può avere più attività, servizi, fornitori di contenuti e / o ascoltatori di broadcast. Se almeno uno di essi è in esecuzione, l'applicazione è attiva e in esecuzione (il processo).

Quindi, ciò che devi identificare è come vuoi "avviare l'applicazione".

Ok ... ecco cosa puoi provare:

  1. Crea un intento con action=MAINecategory=LAUNCHER
  2. Ottieni il PackageManagerdal contesto corrente usandocontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)dove intento ha category=LAUNCHER, action=MAINo packageManager.resolveActivity(<intent>, 0)per ottenere la prima attività con abbaglianti / launcher
  4. Ottieni quello ActivityInfoche ti interessa
  5. Da ActivityInfo, ottieni il packageNameename
  6. Infine, creare un altro intenti con con category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)esetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Finalmente, context.startActivity(newIntent)

Cosa succede se volessi aprire tre app separate?
Si8,

7
La risposta della comunità wiki sotto è meglio, se si conosce il nome del pacchetto stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk

Come è possibile passare i dati tra l'app chiamante e l'app avviata? Ho trovato 'Intent.putExtra ()' ma non so come recuperare i dati extra nell'app avviata.
Bram,

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc
Gaurav Vaish,

2
getPackageManager().getLaunchIntentForPackage()fa già tutto questo per te github.com/android/platform_frameworks_base/blob/master/core/…
jrub

231

Ho lavorato così,

/** 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;
    }
}

Esempio di utilizzo:

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

Spero che aiuti qualcuno.


5
perché getLaunchIntentForPackage ("nome pacchetto app") può causare eccezioni.
xtr

Questa è un'ottima risposta, basta prendere l'eccezione e fare ciò di cui hai bisogno, avvisare l'utente ecc.
IT-Dan

5
Non essere un pignolo, ma non c'è motivo di allocare un nuovo Intento sulla prima linea dato che usi il risultato della getLaunchIntentForPackagechiamata.
Chris Lacy,

2
getLaunchIntentForPackage()aggiunge già la categoria, vedi fonte: 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);

MODIFICARE :

come suggerito nei commenti, aggiungere una riga prima startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
ma richiede di conoscere il nome dell'attività
njzk2,

Ho provato questo e ho ricevuto un errore nel raccomandare di usare il flag FLAG_ACTIVITY_NEW_TASK. Ho aggiunto questa riga prima di startActivity e ha funzionato: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
David-Hoze,

1
@ njzk2 trovare il nome del pacchetto per qualcosa su Google Play è facile; è proprio lì nell'URL. Ad esempio: play.google.com/store/apps/…
Da-Jin

@iceybobby sì, il nome del pacchetto è facile da trovare, ma come si trova il nome della classe dell'attività da avviare?
phreakhead,

@phreakhead Hai ragione. Penso di aver usato la soluzione in questa risposta: stackoverflow.com/a/8944286/1224186 quindi il nome dell'attività non era necessario e quindi penso che la mia risposta a njzk2 non sia di aiuto qui.
Da-Jin,

39

Se hai già il nome del pacchetto che desideri attivare, puoi utilizzare il seguente codice che è un po 'più generico:

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

Ho scoperto che funziona meglio nei casi in cui l'attività principale non è stata trovata dal metodo normale di avvio dell'attività PRINCIPALE.


La migliore risposta per me :-) utile per me. Grazie
Jalpesh Khakhi il

È perfetto per me Grazie mille Muzikant:)
Alex il

13

Questo è il codice della mia soluzione di base sulla soluzione 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();
    }
}

10

Utilizzando la soluzione di inversus, ho ampliato lo snippet con una funzione, che verrà chiamata quando l'applicazione desiderata non è installata al momento. Funziona così: Esegui l'applicazione in base al nome del pacchetto. Se non trovato, apri Android Market - Google Play per questo pacchetto .

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);
}

Ed è usato in questo modo:

startApplication("org.teepee.bazant");

6

Usa questo :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);

Hai qualche idea? aprire un test.apk invece di installarlo nell'archivio dispositivi all'interno dell'applicazione esistente. suggerimenti quando si fa clic su un pulsante app test.apk pranzo che è stato memorizzato nel progetto esistente. grazie in anticipo.
Selim Raza,

6

Apri l'applicazione se esiste o apri l'applicazione Play Store per installarla:

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)));
        }
    }
}

dovrebbe essere if (i! = null)
vallllll

4

Per avviare un'altra attività dell'applicazione dalla mia attività dell'applicazione. Funziona bene per me.

Il codice seguente funzionerà se un'altra applicazione è già installata nel telefono, altrimenti non è possibile reindirizzare da un'app a un'altra app. Quindi assicurarsi che l'app sia stata avviata o meno

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);

Si prega di non scrivere più risposte quasi identiche alla stessa domanda. Usa il link "modifica" sotto la risposta e cambia l'originale.
AdrianHHH,

3

// Funziona su 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;
}

2

Poiché alle applicazioni non è consentito modificare molte delle impostazioni del telefono, è possibile aprire un'attività delle impostazioni proprio come un'altra applicazione.

Guarda l'output di LogCat dopo aver modificato manualmente l'impostazione:

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

Quindi utilizzalo per visualizzare la pagina delle impostazioni dalla tua app:

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
}

2

Per API livello 3+, niente più di una riga di codice:

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

Restituisce un Intento di lancio di CATEGORY_INFO (app senza attività di avvio, sfondi per esempio, spesso lo usano per fornire alcune informazioni sull'app) e, se non lo trovano, restituisce il CATEGORY_LAUNCH del pacchetto, se esiste.


2

Se stai tentando di avviare un SERVIZIO anziché un'attività, questo ha funzionato per me:

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

Se si utilizza il metodo intent.setComponent (...) come indicato in altre risposte, è possibile che venga visualizzato un avviso "Intenzioni implicite con startService non sicuro".


2

In alternativa puoi anche aprire l'intento dalla tua app nell'altra app con:

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

dov'è uriil deeplink verso l'altra app


2

Utilizzare quanto segue:

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

2

Avvia un'applicazione da un'altra applicazione su Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);

2

Se desideri aprire un'altra applicazione che non è installata, puoi inviarla al Google App Store per il download

  1. Innanzitutto creare il metodo openOtherApp per esempio

    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.- Utilizzo

openOtherApp(getApplicationContext(), "com.packageappname");

0

Prova questo codice, spero che questo ti possa aiutare. Se questo pacchetto è disponibile, questo aprirà l'app oppure aprirà il Play Store per i download

    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)));
                }
            }


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.