Ouvrez une autre demande de votre propre (intention)

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

j'ai besoin de savoir comment je peux créer une intention d'ouvrir MyTracks ou toute autre application que je ne sais pas ce que les intentions qu'ils écoutent.

j'ai obtenu cette information du DSAD, mais je n'ai pas réussi à la transformer en une intention que je peux utiliser. Ceci est pris lors de L'ouverture manuelle de MyTracks.

Merci pour 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)
129
demandé sur Steve Haley 2010-05-06 13:48:52

20 réponses

tout d'abord, le concept d ' "application" dans Android est légèrement un étendu.

une demande - techniquement un processus - peut avoir de multiples activités, services, fournisseurs de contenu et/ou auditeurs de radiodiffusion. Si au moins l'un d'entre eux est en cours d'exécution, l'application est en cours d'exécution (le processus).

donc, ce que vous devez identifier, c'est comment voulez-vous"démarrer la demande".

Ok... voici ce que vous pouvez essayer sortie:

  1. créer une intention avec action=MAIN et category=LAUNCHER
  2. Get PackageManager dans le contexte actuel à l'aide de context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0) où l'intention a category=LAUNCHER , action=MAIN ou packageManager.resolveActivity(<intent>, 0) pour obtenir la première activité avec le principal / lanceur
  4. Get ActivityInfo vous êtes intéressés à
  5. De la ActivityInfo , obtenir le packageName et name
  6. enfin, créer une autre intention avec avec category=LAUNCHER , action=MAIN , componentName = new ComponentName(packageName, name) et setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. enfin, context.startActivity(newIntent)
140
répondu Gaurav Vaish 2015-04-13 21:39:38

j'ai un 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, 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'usage:

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

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

224
répondu Anonsage 2017-10-31 15:21:26
    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);

EDIT :

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
95
répondu zawhtut 2015-10-19 21:32:40

Si vous avez déjà le nom du paquet 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 commencer l'activité principale.

38
répondu Muzikant 2012-01-20 16:05:12

C'est le code de ma base de solution 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();
    }
}
13
répondu inversus 2011-10-25 09:18:42

en utilisant la solution d'inversus, j'ai étendu l'extrait avec une fonction, qui sera appelée lorsque l'application désirée n'est pas installée pour le moment. Cela fonctionne donc comme: exécuter l'application par nom de paquet. Si ce n'est pas trouvé, open Android market - Google play pour ce paquet .

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");
10
répondu peter.bartos 2012-06-27 15:13:40

ouvrir l'application si elle existe, ou ouvrir 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)));
        }
    }
}
6
répondu Flinbor 2015-04-07 17:23:16

utilisez ceci:

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
5
répondu Swetha 2014-09-02 06:18:39

pour commencer une autre activité d'application de mon activité d'application. Il fonctionne très bien pour moi.

ci-dessous le code fonctionnera si l'autre application déjà installée dans votre téléphone autrement il n'est pas possible de rediriger une application vers une autre application.Alors assurez-vous que votre application lancée ou pas

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
4
répondu KCN 2016-05-13 07:49:04

/ / 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;
}
3
répondu Anil Kongovi 2015-05-28 11:41:27

comme les applications ne sont pas autorisées à changer beaucoup de paramètres de téléphone, vous pouvez ouvrir une activité de paramètres comme une autre application.

regardez la 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
}
2
répondu Tary 2013-03-18 14:40:17

pour API Niveau 3+, rien de plus qu'une ligne de code:

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

renvoie une intention de lancement CATEGORY_INFO (apps sans activité de lanceur, fonds d'écran par exemple, souvent utilisé pour fournir quelques informations sur app) et, si aucune trouver, renvoie la CATEGORY_LAUNCH du paquet, s'il existe.

2
répondu Renascienza 2014-01-26 13:09:45

si vous tentez de lancer 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 l'intention.setComponent(...) méthode comme mentionné dans d'autres réponses, vous pouvez obtenir un avertissement "les intentions implicites avec startService ne sont pas sécuritaires".

2
répondu Dunc 2014-10-01 10:29:31

Sinon, vous pouvez également ouvrir l'intention de votre application dans l'application d'autres avec:

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

uri est le lien profond avec l'autre application

2
répondu electrobabe 2016-01-10 07:08:52

utiliser la mention suivante:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
2
répondu user6765242 2016-09-01 09:06:19

lancer une application à partir d'une autre application sur Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
2
répondu Ashutosh Srivastava 2017-01-02 12:19:23

si vous souhaitez ouvrir une autre application et qu'elle n'est pas installée, vous pouvez l'Envoyer à Google App Store pour télécharger ""

  1. créer D'abord la méthode openOtherApp par exemple

    public static boolean openApp(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.- L'utilisation de la

openOtherApp(getApplicationContext(), "com.packageappname");
1
répondu Vladimir Salguero 2018-04-23 22:34:44

essayez ce code, en espérant que cela vous aidera. Si ce paquet est disponible, alors cela ouvrira l'application ou bien ouvrir le magasin de lecture 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)));
                }
            }
0
répondu AMAN SINGH 2017-06-20 18:09:59

vous pouvez utiliser cette commande pour trouver les noms de paquets 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 /

0
répondu JDPMan 2018-05-02 19:31:07
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
-3
répondu Manzer 2012-09-16 14:46:01