Ouvrez une autre application de votre propre (intention)

136

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

J'ai besoin de savoir comment je peux créer une intention pour ouvrir MyTracks ou toute autre application dont je ne sais pas quelles intentions ils écoutent.

J'ai obtenu cette information de DDMS, mais je n'ai pas réussi à transformer cela en une intention que je peux utiliser. Ceci est tiré 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)
AndersWid
la source

Réponses:

141

Premièrement, le concept d '«application» sous 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 voulez-vous "démarrer l'application".

Ok ... voici ce que vous pouvez essayer:

  1. Créez une intention avec action=MAINetcategory=LAUNCHER
  2. Obtenez le PackageManagerdu contexte actuel en utilisantcontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)où l'intention a category=LAUNCHER, action=MAINou packageManager.resolveActivity(<intent>, 0)pour obtenir la première activité avec main / launcher
  4. Obtenez le qui ActivityInfovous intéresse
  5. Depuis le ActivityInfo, récupérez le packageNameetname
  6. Enfin, créer une autre intention avec avec category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)etsetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Finalement, context.startActivity(newIntent)
Gaurav Vaish
la source
Et si je voulais ouvrir trois applications distinctes?
Si8
7
La réponse wiki de la communauté ci-dessous est meilleure, si vous connaissez le nom du paquet stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk
Comment pouvez-vous passer des données entre l'application appelante et l'application lancée? J'ai trouvé 'Intent.putExtra ()' mais je ne sais pas comment récupérer les données supplémentaires dans l'application lancée.
Bram
onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc
Gaurav Vaish
2
getPackageManager().getLaunchIntentForPackage()fait déjà tout cela pour vous github.com/android/platform_frameworks_base/blob/master/core/…
jrub
231

J'ai travaillé 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, 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;
    }
}

Exemple d'utilisation:

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

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

Anonsage
la source
5
car getLaunchIntentForPackage ("nom du package d'application") peut provoquer une exception.
xtr
C'est une excellente réponse, attrapez simplement l'exception et faites ce dont vous avez besoin, informez l'utilisateur, etc.
IT-Dan
5
Ne pas être un stickler, mais il n'y a aucune raison d'allouer une nouvelle intention sur la première ligne étant donné que vous utilisez le résultat de l' getLaunchIntentForPackageappel.
Chris Lacy
2
getLaunchIntentForPackage()ajoute déjà la catégorie, voir source: 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);

ÉDITER :

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
zawhtut
la source
18
mais il faut connaître le nom de l'activité
njzk2
J'ai essayé cela et j'ai eu une erreur recommandant d'utiliser l'indicateur FLAG_ACTIVITY_NEW_TASK. J'ai ajouté cette ligne avant startActivity et cela a fonctionné: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze
1
@ njzk2 trouver le nom du package pour quelque chose sur Google Play est facile; il est juste là dans l'URL. Par exemple: play.google.com/store/apps/…
Da-Jin
@iceybobby oui le nom du package est facile à trouver, mais comment trouver le nom de classe de l'activité à lancer?
phreakhead
@phreakhead Vous avez raison. Je pense que j'ai utilisé la solution dans cette réponse: stackoverflow.com/a/8944286/1224186 donc le nom de l'activité n'était pas nécessaire, et donc je pense que ma réponse à njzk2 est inutile ici.
Da-Jin
39

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 pour les cas où l'activité principale n'a pas été trouvée par la méthode régulière de démarrage de l'activité MAIN.

Muzikant
la source
Meilleure réponse pour moi :-) utile pour moi. Merci
Jalpesh Khakhi
C'est parfait pour moi. Merci beaucoup Muzikant :)
Alex
13

Voici le code de ma solution basée sur la solution 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
la source
10

En utilisant la solution d'inversus, j'ai développé 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 vous ne le trouvez pas, ouvrez Android Market - Google Play pour ce package .

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

Et il est utilisé comme ceci:

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

Utilisez ceci :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Swetha
la source
Avez-vous une idée? ouvrez un test.apk au lieu d'être installé dans le magasin de périphériques dans l'application existante. conseils lorsque vous cliquez sur un bouton des applications de test.apk déjeuner qui a été stocké dans un projet existant. Merci d'avance.
Selim Raza du
6

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, 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
la source
devrait être if (i! = null)
vallllll
4

Pour démarrer une autre activité d'application à partir de mon activité d'application. Cela fonctionne bien pour moi.

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

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
KCN
la source
Veuillez ne pas écrire plusieurs réponses presque identiques à la même question. Utilisez le lien "modifier" sous la réponse et modifiez l'original.
AdrianHHH
3

// Cela fonctionne sur 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
la source
2

Étant donné que les applications ne sont pas autorisées à modifier de nombreux paramètres du téléphone, vous pouvez ouvrir une activité de paramètres 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 ceci pour afficher la page des paramètres de votre application:

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
la source
2

Pour l'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 aucune information n'est trouvée, renvoie le CATEGORY_LAUNCH du package, s'il existe.

Renascienza
la source
2

Si vous essayez de démarrer un SERVICE plutôt qu'une 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 mentionné dans d'autres réponses, vous pouvez obtenir un avertissement «Les intentions implicites avec startService ne sont pas sûres».

Dunc
la source
2

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

uriest le lien profond vers l'autre application

électrobabe
la source
2

Utilisez ce qui suit:

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

Lancer une application depuis une autre application sur Android

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

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

  1. Créez d'abord la méthode openOtherApp par exemple

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

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

Essayez ce code, j'espère que cela vous aidera. Si ce package est disponible, cela ouvrira l'application ou ouvrira le Play Store pour les téléchargements

    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
la source
-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
la source