2010-10-06 23 views
381

Voglio avviare un pacchetto installato dalla mia applicazione Android. Presumo che sia possibile utilizzare gli intent, ma non ho trovato il modo di farlo. C'è un link, dove trovare le informazioni?Avviare un'applicazione da un'altra applicazione su Android

+1

cosa succede se apro la seconda app dal primo e poi clicco direttamente sull'icona della seconda app, ottengo due istanze dell'app, che è indesiderata. Come gestirlo ?? – Radhey

+0

Possibile duplicato di [Come chiamare un'applicazione Android da un'altra applicazione Android] (http://stackoverflow.com/questions/2728465/how-to-call-one-android-application-from-another-android-application) – Vaikesh

risposta

2

Se si conoscono i dati e l'azione su cui il pacchetto installato reagisce, è sufficiente aggiungere queste informazioni all'istanza di intenti prima di avviarla.

Se si ha accesso a AndroidManifest dell'altra app, è possibile visualizzare tutte le informazioni necessarie lì.

+1

Grazie per la risposta. Sì, ho AndroidManifest dell'altra applicazione. Quello che provo a fare ora è il seguente codice: Intent intent = new Intent (Intent.ACTION_MAIN); intent.setComponent (new ComponentName ("com.package", ". MainActivity")); startActivity (intento); ma in questo modo non funziona. Puoi darmi un link più preciso, come farlo? – Bastian

+1

Qual è il messaggio di errore che hai nel tuo LogCat? – WarrenFaith

+1

L'applicazione si arresta in modo anomalo alla riga "startActivity ...": l'applicazione si è arrestata in modo imprevisto. Si prega di riprovare. Dove posso vedere l'errore in LogCat? – Bastian

128

Ho trovato la soluzione. Nel file manifest dell'applicazione ho trovato il nome del pacchetto: com.package.address e il nome dell'attività principale che voglio lanciare: MainActivity Il codice seguente avvia questa applicazione:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity")); 
startActivity(intent); 
+2

Grazie per la risposta! – hopia

+3

ho ottenuto l'eccezione 'dose dichiari attività nel tuo manifest.xml' – itzhar

+0

In questo modo restituisce un'eccezione che dice che ho bisogno di dichiarare l'attività nel mio manifest .. ma è un'app esterna! –

589

Se don Conosce l'attività principale, quindi il nome del pacchetto può essere utilizzato per avviare l'applicazione.

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address"); 
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found 
} 
+10

Mi ha salvato un sacco di tempo, grazie e +1! – Justin

+3

Alcun motivo per spiegare perché non funzionerebbe? Almeno non l'ho fatto funzionare. –

+12

Inizia una nuova intenzione, che ne dici di riprendere l'applicazione che si trova in background? –

184

So che questo è stato risposto, ma ecco come ho implementato qualcosa di simile:

Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name"); 
if (intent != null) { 
    // We found the activity now start the activity 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} else { 
    // Bring user to the market or let them choose an app? 
    intent = new Intent(Intent.ACTION_VIEW); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setData(Uri.parse("market://details?id=" + "com.package.name")); 
    startActivity(intent); 
} 

Ancora meglio, qui è il metodo:

public void startNewActivity(Context context, String packageName) { 
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName); 
    if (intent != null) { 
     // We found the activity now start the activity 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } else { 
     // Bring user to the market or let them choose an app? 
     intent = new Intent(Intent.ACTION_VIEW); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.setData(Uri.parse("market://details?id=" + packageName)); 
     context.startActivity(intent); 
    } 
} 

codice duplicato Rimosso:

public void startNewActivity(Context context, String packageName) { 
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName); 
    if (intent == null) { 
     // Bring user to the market or let them choose an app? 
     intent = new Intent(Intent.ACTION_VIEW); 
     intent.setData(Uri.parse("market://details?id=" + packageName)); 
    } 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(intent); 
} 
+5

Ho riscontrato un problema durante l'avvio di un'intenzione su un profilo Facebook o Twitter. Si stavano aprendo all'interno della mia app, invece che come una nuova attività. L'aggiunta di FLAG_ACTIVITY_NEW_TASK ha risolto questo problema. Grazie! – Harry

+3

Nessun problema! Avevo problemi con qualcosa di molto simile –

+1

Il metodo funziona per me, ma a volte la nuova applicazione è aperta e l'attività di chiamata è ancora in primo piano. Qualche idea su come risolvere? – lgdroid57

13

Qui è il mio esempio di lanciare scanner codice a barre/QR dalla mia applicazione se qualcuno trova utile

Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
intent.setPackage("com.google.zxing.client.android"); 

try 
{ 
    startActivityForResult(intent, SCAN_REQUEST_CODE); 
} 
catch (ActivityNotFoundException e) 
{ 
    //implement prompt dialog asking user to download the package 
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this); 
    downloadDialog.setTitle(stringTitle); 
    downloadDialog.setMessage(stringMessage); 
    downloadDialog.setPositiveButton("yes", 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialogInterface, int i) 
       { 
        Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android"); 
        Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
        try 
        { 
         myActivity.this.startActivity(intent); 
        } 
        catch (ActivityNotFoundException e) 
        { 
         Dialogs.this.showAlert("ERROR", "Google Play Market not found!"); 
        } 
       } 
      }); 
    downloadDialog.setNegativeButton("no", 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialog, int i) 
       { 
        dialog.dismiss(); 
       } 
      }); 
    downloadDialog.show(); 
} 
4
// check for the app if it exist in the phone it will lunch it otherwise, it will search for the app in google play app in the phone and to avoid any crash, if no google play app installed in the phone, it will search for the app in the google play store using the browser : 

public void onLunchAnotherApp() { 

     final String appPackageName = getApplicationContext().getPackageName(); 

     Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName); 
     if (intent != null) { 

      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent); 

     } else { 

      onGoToAnotherInAppStore(intent, appPackageName); 

     } 

    } 

    public void onGoToAnotherInAppStore(Intent intent, String appPackageName) { 

     try { 

      intent = new Intent(Intent.ACTION_VIEW); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.setData(Uri.parse("market://details?id=" + appPackageName)); 
      startActivity(intent); 

     } catch (android.content.ActivityNotFoundException anfe) { 

      intent = new Intent(Intent.ACTION_VIEW); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName)); 
      startActivity(intent); 

     } 

    } 
+0

esiste un limite di caratteri per il metodo uri.parse? – API

0

Procedura per lanciare nuove attività come segue:

1.Get intenti per pacchetto

intento 2.If è user reindirizzamento nullo per playstore

3.If intento non è nullo settore aperto

public void launchNewActivity(Context context, String packageName) { 
    Intent intent = null; 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) { 
     intent = context.getPackageManager().getLaunchIntentForPackage(packageName); 
    } 
    if (intent == null) { 
     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 (android.content.ActivityNotFoundException anfe) { 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName))); 
     } 
    } else { 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
} 
5

// oncreate openApp();

private void openApp() { 
    String packageName = "com.google.android.gm"; 
    if (isAppInstalled(activity, packageName)) 
     startActivity(getPackageManager().getLaunchIntentForPackage(packageName)); 
    else Toast.makeText(activity, "App not installed", Toast.LENGTH_SHORT).show(); 
} 

public static boolean isAppInstalled(Activity activity, String packageName) { 
    PackageManager pm = activity.getPackageManager(); 
    try { 
     pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); 
     return true; 
    } catch (PackageManager.NameNotFoundException e) { 
    } 
    return false; 
} 
1

Se si desidera aprire un'attività specifica di un'altra applicazione, è possibile utilizzarla.

Intent intent = new Intent(Intent.ACTION_MAIN, null); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary"); 
intent.setComponent(cn); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
try 
{ 
    startActivity(intent) 
}catch(ActivityNotFoundException e){ 
    Toast.makeText(context,"Activity Not Found",Toast.LENGTH_SHORT).show() 
} 

Se è necessario bisogno di altre applicazioni invece di mostrare Toast si può mostrare una finestra di dialogo, che può portare l'utente a Play-Store.

Problemi correlati