Ouvrez une autre application de votre choix (intention)

Je sais comment mettre à jour mes propres programmes, et je sais comment ouvrir des programmes en utilisant un Uri prédéfini (par exemple pour sms ou email)

J’ai besoin de savoir comment je peux créer une intention d’ouvrir MyTracks ou toute autre application que je ne connais pas les intentions d’écoute.

J’ai eu cette information de DDMS, mais je n’ai pas réussi à transformer cela en une intention que je peux utiliser. Ceci est pris lors de l’ouverture manuelle de MyTracks.

Merci de votre aide

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) 

Tout d’abord, le concept de “application” dans Android est légèrement étendu.

Une application – techniquement un processus – peut avoir plusieurs activités, services, fournisseurs de contenu et / ou auditeurs de diffusion. Si au moins l’un d’entre eux est en cours d’exécution, l’application est opérationnelle (le processus).

Donc, ce que vous devez identifier, c’est comment vous voulez “lancer l’application”.

Ok … voici ce que vous pouvez essayer:

  1. Créer une intention avec action=MAIN et category=LAUNCHER
  2. Récupère le PackageManager partir du contexte actuel en utilisant context.getPackageManager
  3. packageManager.queryIntentActivity(, 0)category=LAUNCHER a category=LAUNCHER , action=MAIN ou packageManager.resolveActivity(, 0) pour obtenir la première activité avec main / launcher
  4. Obtenez le ActivityInfo vous intéresse
  5. À partir du ActivityInfo , obtenez le name packageName et le name
  6. Enfin, créez une autre intention avec avec la category=LAUNCHER , action=MAIN , componentName = new ComponentName(packageName, name) et setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Enfin, context.startActivity(newIntent)

J’ai du travail comme ça,

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

Exemple d’utilisation:

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

J’espère que ça aide quelqu’un.

  Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(ComponentName.unflattenFromSsortingng("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks")); intent.addCategory(Intent.CATEGORY_LAUNCHER); startActivity(intent); 

MODIFIER :

comme suggéré dans les commentaires, ajoutez une ligne avant startActivity(intent);

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Si vous avez déjà le nom du package que vous souhaitez activer, vous pouvez utiliser le code suivant, qui est un peu plus générique:

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

J’ai trouvé que cela fonctionne mieux dans les cas où l’activité principale n’a pas été trouvée par la méthode habituelle de démarrage de l’activité MAIN.

Voici le code de ma base de solution sur la solution MasterGaurav:

 private void launchComponent(Ssortingng packageName, Ssortingng 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(Ssortingng 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_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(); } } 

En utilisant la solution de inversus, j’ai élargi l’extrait de code avec une fonction, qui sera appelée lorsque l’application souhaitée n’est pas installée pour le moment. Cela fonctionne donc comme: Exécutez l’application par nom de package. Si non trouvé, ouvrez Android Market – Google Play pour ce paquet .

 public void startApplication(Ssortingng packageName) { try { Intent intent = new Intent("android.intent.action.MAIN"); intent.addCategory("android.intent.category.LAUNCHER"); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); List 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(Ssortingng packageName, Ssortingng 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(Ssortingng packageName) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 

Et il est utilisé comme ceci:

 startApplication("org.teepee.bazant"); 

Ouvrez l’application si elle existe ou ouvrez l’application Play Store pour l’installer:

 private void open() { openApplication(getActivity(), "com.app.package.here"); } public void openApplication(Context context, Ssortingng 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))); } } } 

Utilisez ceci :

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

Pour démarrer une autre activité d’application à partir de mon activité d’application. Cela fonctionne très bien pour moi.

Le code ci-dessous fonctionnera si l’autre application est déjà installée sur votre téléphone, sinon il n’est pas possible de redirect une application vers une autre application. Assurez-vous que votre application est lancée ou non

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

// Cela fonctionne sur Android Lollipop 5.0.2

 public static boolean launchApp(Context context, Ssortingng packageName) { final PackageManager manager = context.getPackageManager(); final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN); appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER); List resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0); if ((null != resolveInfos) && (!resolveInfos.isEmpty())) { for (ResolveInfo rInfo : resolveInfos) { Ssortingng className = rInfo.activityInfo.name.sortingm(); Ssortingng targetPackageName = rInfo.activityInfo.packageName.sortingm(); Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName); if (packageName.sortingm().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; } 

Comme les applications ne sont pas autorisées à modifier la plupart des parameters du téléphone, vous pouvez ouvrir une activité de parameters comme une autre application.

Regardez votre sortie LogCat après avoir modifié le paramètre manuellement:

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

Ensuite, utilisez cette option pour afficher la page des parameters de votre application:

 Ssortingng SettingsPage = "com.android.settings/.DevelopmentSettings"; try { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(ComponentName.unflattenFromSsortingng(SettingsPage)); intent.addCategory(Intent.CATEGORY_LAUNCHER ); startActivity(intent); } catch (ActivityNotFoundException e) { log it } 

Pour API niveau 3+, rien de plus qu’une ligne de code:

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

Renvoyer une intention de lancement CATEGORY_INFO (les applications sans activité de lancement, les fonds d’écran par exemple, l’utilisent souvent pour fournir des informations sur l’application) et, si elle ne les trouve pas, renvoie la valeur CATEGORY_LAUNCH du paquet, s’il existe.

Si vous essayez de démarrer un SERVICE plutôt que de faire de l’activité, cela a fonctionné pour moi:

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

Si vous utilisez la méthode intent.setComponent (…) comme indiqué dans d’autres réponses, vous pouvez obtenir un avertissement “Intentions implicites avec startService non sécurisées”.

Vous pouvez également ouvrir l’intention de votre application dans l’autre application avec:

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

uri est le deeplink à l’autre application

Utiliser suivant:

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

Lancer une application depuis une autre application sur Android

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

Si vous souhaitez ouvrir une autre application et qu’elle n’est pas installée, vous pouvez l’envoyer à Google App Store pour la télécharger.

  1. Commencez par créer la méthode openOtherApp par exemple

     public static boolean openApp(Context context, Ssortingng 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.- utilisation

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

Essayez ce code, espérons que cela vous aidera. Si ce paquet est disponible, cela ouvrira l’application ou ouvrira le magasin de jeux pour les téléchargements

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

Vous pouvez utiliser cette commande pour rechercher les noms de package installés sur un périphérique:

 adb shell pm list packages -3 -f 

Référence: http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/

 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(new ComponentName("package_name","package_name.class_name")); intent.putExtra("grace", "Hi"); startActivity(intent);