wake-up-neo.com

Öffne eine andere Anwendung von deiner eigenen (Absicht)

Ich weiß, wie ich meine eigenen Programme aktualisiere, und ich kann Programme mit einem vordefinierten Uri öffnen (z. B. für SMS oder E-Mail).

Ich muss wissen, wie ich eine Absicht erstellen kann, um MyTracks oder eine andere Anwendung zu öffnen, von der ich nicht weiß, welche Absicht sie hören.

Ich habe diese Informationen von DDMS erhalten, aber es ist mir nicht gelungen, diese Absicht 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)
132
AndersWid

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

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

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

Ok ... Folgendes kannst du ausprobieren:

  1. Erstellen Sie eine Absicht mit action=MAIN und category=LAUNCHER
  2. Rufen Sie PackageManager aus dem aktuellen Kontext mit context.getPackageManager ab.
  3. packageManager.queryIntentActivity(<intent>, 0) wo die Absicht category=LAUNCHER, action=MAIN oder packageManager.resolveActivity(<intent>, 0) ist, um die erste Aktivität mit main/launcher abzurufen
  4. Holen Sie sich das ActivityInfo, an dem Sie interessiert sind
  5. Rufen Sie aus ActivityInfo die packageName und name ab.
  6. Erstellen Sie schließlich eine weitere Absicht mit category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name) und setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Zum Schluss context.startActivity(newIntent)
140
Gaurav Vaish

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

Verwendungsbeispiel:

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

Hoffe es hilft jemandem.

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

BEARBEITEN:  

wie in Kommentaren vorgeschlagen, fügen Sie eine Zeile vor startActivity(intent); ein.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
95
zawhtut

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

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

Ich habe festgestellt, dass es besser für Fälle funktioniert, in denen die Hauptaktivität nicht mit der regulären Methode zum Starten der MAIN-Aktivität gefunden wurde.

38
Muzikant

Dies ist der Code meiner Lösung, die auf der MasterGaurav-Lösung basiert:

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

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. Es funktioniert also wie folgt: Anwendung nach Paketnamen ausführen. 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");
10
peter.bartos

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

Benutze das :

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

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

Der folgende Code funktioniert, wenn eine andere Anwendung bereits auf Ihrem Telefon installiert ist. Andernfalls ist es nicht möglich, eine App an eine andere App weiterzuleiten. Stellen Sie sicher, dass Ihre App gestartet wurde oder nicht.

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

// Das funktioniert auf 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

Starten Sie eine Anwendung von einer anderen Anwendung auf Android

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

Für API-Level 3+ nicht mehr als eine Codezeile:

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

Einen Intent-Start von CATEGORY_INFO zurückgeben (Apps ohne Launcher-Aktivität, z. B. Hintergrundbilder, geben häufig Informationen zur App an) und geben, falls vorhanden, das Paket CATEGORY_LAUNCH des Pakets zurück, falls vorhanden. 

2
Renascienza

Alternativ können Sie die Absicht auch von Ihrer App aus in der anderen App öffnen mit:

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

wobei uri der Deeplink zur anderen App ist

2
electrobabe

Verwenden Sie folgendes:

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

Wenn Sie versuchen, einen SERVICE und nicht eine 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 (...) wie in anderen Antworten erwähnt verwenden, wird möglicherweise die Warnung "Implizite Absichten mit startService sind nicht sicher" angezeigt.

2
Dunc

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 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 dann 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
}
2
Tary

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 Methode openOtherApp

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

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

Mit diesem Befehl können Sie die auf einem Gerät installierten Paketnamen suchen:

adb Shell pm list packages -3 -f

Referenz: http://www.aftvnews.com/wie-zu-bestimmen-des-paketname-von-an-Android-app/

0
JPritchard9518

Versuchen Sie es mit diesem Code. Wenn dieses Paket verfügbar ist, wird die App 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)));
                }
            }
0
AMAN SINGH