Öffnen Sie eine andere Anwendung von Ihrer eigenen (Absicht)

136

Ich weiß, wie ich meine eigenen Programme aktualisiere und wie ich Programme mit einer vordefinierten Uri öffne (zum Beispiel für SMS oder E-Mail).

Ich muss wissen, wie ich eine Absicht zum Öffnen von MyTracks oder einer anderen Anwendung erstellen kann, von der ich nicht weiß, welche Absichten sie hören.

Ich habe diese Informationen von DDMS erhalten, aber es ist mir nicht gelungen, dies in eine Absicht umzuwandeln, die ich verwenden kann. Dies wird beim manuellen Öffnen von MyTracks übernommen.

Danke für Ihre Hilfe

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
quelle

Antworten:

141

Erstens ist das Konzept der "Anwendung" in Android etwas erweitert.

Eine Anwendung - technisch gesehen ein Prozess - kann mehrere Aktivitäten, Dienste, Inhaltsanbieter und / oder Broadcast-Listener haben. Wenn mindestens einer von ihnen ausgeführt wird, ist die Anwendung aktiv (der Prozess).

Was Sie also identifizieren müssen, ist, wie Sie "die Anwendung starten" möchten.

Ok ... hier ist was du ausprobieren kannst:

  1. Erstellen Sie eine Absicht mit action=MAINundcategory=LAUNCHER
  2. Holen Sie sich das PackageManageraus dem aktuellen Kontext mitcontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)wo die Absicht hat category=LAUNCHER, action=MAINoder packageManager.resolveActivity(<intent>, 0)die erste Aktivität mit main / launcher zu bekommen
  4. Holen ActivityInfoSie sich das, was Sie interessiert
  5. Holen Sie ActivityInfosich das packageNameundname
  6. Schließlich erstellen Sie eine andere Absicht mit mit category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)undsetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Schließlich, context.startActivity(newIntent)
Gaurav Vaish
quelle
Was wäre, wenn ich drei separate Apps öffnen wollte?
Si8
7
Die Community-Wiki-Antwort unten ist besser, wenn Sie den Paketnamen stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk
Wie können Sie Daten zwischen der aufrufenden App und der gestarteten App übertragen? Ich habe 'Intent.putExtra ()' gefunden, weiß aber nicht, wie ich die zusätzlichen Daten in der gestarteten App abrufen soll.
Bram
onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc
Gaurav Vaish
2
getPackageManager().getLaunchIntentForPackage()erledigt das alles schon für dich github.com/android/platform_frameworks_base/blob/master/core/…
jrub
231

Ich habe es so gemacht,

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

Anwendungsbeispiel:

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

Hoffe es hilft jemandem.

Anonsage
quelle
5
weil getLaunchIntentForPackage ("Name des App-Pakets") eine Ausnahme verursachen kann.
xtr
Dies ist eine großartige Antwort, fangen Sie einfach die Ausnahme und tun Sie, was Sie brauchen, benachrichtigen Sie den Benutzer usw.
IT-Dan
5
Nicht um ein Stickler zu sein, aber es gibt keinen Grund, in der ersten Zeile eine neue Absicht zuzuweisen, wenn Sie das Ergebnis des getLaunchIntentForPackageAnrufs verwenden.
Chris Lacy
2
getLaunchIntentForPackage()fügt die Kategorie bereits hinzu, siehe Quelle: 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);

EDIT:

Fügen Sie, wie in den Kommentaren vorgeschlagen, zuvor eine Zeile hinzu startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
zawhtut
quelle
18
aber es erfordert, den Namen der Aktivität zu kennen
njzk2
Ich habe dies versucht und eine Fehlermeldung erhalten, in der empfohlen wurde, das FLAG_ACTIVITY_NEW_TASK-Flag zu verwenden. Ich habe diese Zeile vor startActivity hinzugefügt und es hat funktioniert: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
David-Hoze
1
@ njzk2 Es ist einfach, den Paketnamen für etwas bei Google Play zu finden. es ist genau dort in der URL. Zum Beispiel: play.google.com/store/apps/…
Da-Jin
@iceybobby Ja, der Paketname ist leicht zu finden, aber wie finden Sie den Klassennamen der zu startenden Aktivität?
Phreakhead
@phreakhead Du hast recht. Ich glaube, ich habe die Lösung in dieser Antwort verwendet: stackoverflow.com/a/8944286/1224186, sodass der Aktivitätsname nicht benötigt wurde. Daher ist meine Antwort auf njzk2 hier nicht hilfreich.
Da-Jin
39

Wenn Sie bereits den Paketnamen haben, den Sie aktivieren möchten, können Sie den folgenden Code verwenden, der etwas allgemeiner ist:

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

Ich fand, dass es in Fällen besser funktioniert, in denen die Hauptaktivität nicht durch die reguläre Methode zum Starten der Hauptaktivität gefunden wurde.

Muzikant
quelle
Beste Antwort für mich :-) hilfreich für mich. Vielen Dank
Jalpesh Khakhi
Es ist perfekt für mich. Vielen Dank Muzikant :)
Alex
13

Dies ist der Code meiner Lösungsbasis für die MasterGaurav-Lösung:

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
quelle
10

Mit der Lösung von inversus habe ich das Snippet um eine Funktion erweitert, die aufgerufen wird, wenn die gewünschte Anwendung momentan nicht installiert ist. So funktioniert es: Führen Sie die Anwendung nach Paketnamen aus. Wenn nicht gefunden, öffnen Sie den Android Market - Google Play für dieses Paket .

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

Und es wird so verwendet:

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

Benutze das :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Swetha
quelle
Hast du eine Idee? Öffnen Sie eine test.apk, anstatt sie im Gerätespeicher in einer vorhandenen Anwendung zu installieren. Hinweise zum Klicken auf eine Schaltfläche Mittagessen test.apk Apps, die in einem vorhandenen Projekt gespeichert wurden. Danke im Voraus.
Selim Raza
6

Öffnen Sie die Anwendung, falls vorhanden, oder öffnen Sie die Play Store-Anwendung, um sie zu installieren:

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
quelle
sollte sein, wenn (i! = null)
vallllll
4

So starten Sie eine andere Anwendungsaktivität über meine Anwendungsaktivität. Es funktioniert gut für mich.

Der folgende Code funktioniert, wenn die andere Anwendung bereits auf Ihrem Telefon installiert ist. Andernfalls ist es nicht möglich, von einer App zu einer anderen App umzuleiten. Stellen Sie also sicher, dass Ihre App gestartet wurde oder nicht

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
KCN
quelle
Bitte schreiben Sie nicht mehrere Antworten, die fast identisch mit derselben Frage sind. Verwenden Sie den Link "Bearbeiten" unter der Antwort und ändern Sie das Original.
AdrianHHH
3

// Dies funktioniert unter 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
quelle
2

Da Anwendungen viele Telefoneinstellungen nicht ändern dürfen, können Sie eine Einstellungsaktivität wie eine andere Anwendung öffnen.

Sehen Sie sich Ihre LogCat-Ausgabe an, nachdem Sie die Einstellung tatsächlich manuell geändert haben:

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

Verwenden Sie diese Option, um die Einstellungsseite Ihrer App anzuzeigen:

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
quelle
2

Für API Level 3+ nichts weiter als eine Codezeile:

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

Rückgabe einer CATEGORY_INFO-Startabsicht (Apps ohne Startaktivität, z. B. Hintergrundbilder, verwenden diese häufig, um Informationen zur App bereitzustellen) und, falls nicht gefunden, geben Sie die CATEGORY_LAUNCH des Pakets zurück, falls vorhanden.

Renascienza
quelle
2

Wenn Sie versuchen, einen SERVICE anstelle einer Aktivität zu starten, hat dies für mich funktioniert:

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

Wenn Sie die Methode intent.setComponent (...) verwenden, wie in anderen Antworten erwähnt, wird möglicherweise die Warnung "Implizite Absichten mit startService sind nicht sicher" angezeigt.

Dunc
quelle
2

Alternativ können Sie die Absicht auch über Ihre App in der anderen App öffnen mit:

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

Wo uriist der Deeplink zur anderen App?

Elektrobabe
quelle
2

Verwenden Sie Folgendes:

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

Starten Sie eine Anwendung von einer anderen Anwendung auf Android

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

Wenn Sie eine andere Anwendung öffnen möchten und diese nicht installiert ist, können Sie sie zum Herunterladen an den Google App Store senden

  1. Erstellen Sie zunächst beispielsweise die openOtherApp-Methode

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

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

Versuchen Sie diesen Code. Ich hoffe, dies wird Ihnen helfen. Wenn dieses Paket verfügbar ist, wird die App geöffnet oder der Play Store zum Herunterladen geöffnet

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