web-dev-qa-db-fra.com

Ouvrez une autre application à partir de votre propre (intention)

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

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

DDMS m'a fourni cette information, mais je n'ai pas réussi à en faire une intention que je peux utiliser. Ceci est pris à partir 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)
132
AndersWid

Premièrement, le concept d '"application" sous Android est légèrement plus é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 en cours d'exécution (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éer une intention avec action=MAIN et category=LAUNCHER
  2. Obtenez la PackageManager du contexte actuel en utilisant context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0) où intention a category=LAUNCHER, action=MAIN ou packageManager.resolveActivity(<intent>, 0) pour obtenir la première activité avec main/launcher
  4. Obtenez laActivityInfo qui vous intéresse
  5. Dans ActivityInfo, obtenez les packageName et name
  6. Enfin, créez 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
Gaurav Vaish

J'ai le 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'utilisation:

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

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

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

MODIFIER :  

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
95
zawhtut

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

38
Muzikant

Voici le code de ma 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
inversus

À l'aide de la solution 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. Donc, cela fonctionne comme: Exécuter l’application par nom de paquet. Si non trouvé, 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");
10
peter.bartos

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

Utilisez ceci :

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

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. 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);
4
KCN

// 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
Anil Kongovi

Lancer une application depuis une autre application sur Android

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

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

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

Renvoie une intention de lancement de CATEGORY_INFO (applications sans activité de lancement, fonds d'écran par exemple, l'utilise souvent pour fournir des informations sur l'application) et, si aucune recherche n'est trouvée, renvoie le package CATEGORY_LAUNCH, s'il existe. 

2
Renascienza

Sinon, 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 lien profond vers l'autre application

2
electrobabe

Utilisez ce qui suit:

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

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 indiqué dans d'autres réponses, un avertissement "Les intentions implicites avec startService ne sont pas sûres".

2
Dunc

Etant donné que les applications ne sont pas autorisées à modifier de nombreux paramètres du téléphone, vous pouvez ouvrir une activité de configuration comme une autre application.

Regardez votre sortie LogCat après avoir modifié manuellement le réglage:

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 de 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
Tary

Si vous souhaitez ouvrir une autre application qui 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, 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");
1
Vladimir Salguero

Vous pouvez utiliser cette commande pour rechercher les noms de packages 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
JPritchard9518

Essayez ce code, espérons 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)));
                }
            }
0
AMAN SINGH