Otwórz inną aplikację z własnej (intencji)

136

Wiem, jak aktualizować własne programy i potrafię otwierać programy za pomocą predefiniowanego Uri (na przykład dla smsów lub e-maili)

Muszę wiedzieć, jak mogę stworzyć intencję, aby otworzyć MyTracks lub inną aplikację, której nie wiem, jakich zamiarów słuchają.

Otrzymałem te informacje z DDMS, ale nie udało mi się zmienić tego w intencję, której mogę użyć. Jest to pobierane podczas ręcznego otwierania MyTracks.

Dzięki za pomoc

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
źródło

Odpowiedzi:

141

Po pierwsze, pojęcie „aplikacji” w Androidzie jest nieco rozszerzone.

Aplikacja - z technicznego punktu widzenia proces - może mieć wiele działań, usług, dostawców treści i / lub słuchaczy. Jeśli przynajmniej jeden z nich jest uruchomiony, aplikacja jest uruchomiona (proces).

Musisz więc określić, w jaki sposób chcesz „uruchomić aplikację”.

Ok ... oto co możesz wypróbować:

  1. Utwórz intencję za pomocą action=MAINicategory=LAUNCHER
  2. Pobierz PackageManagerz bieżącego kontekstu za pomocącontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)gdzie zamiar ma category=LAUNCHER, action=MAINlub packageManager.resolveActivity(<intent>, 0)aby uzyskać pierwszą aktywność z main / launcherem
  4. Zdobądź to, ActivityInfoco Cię interesuje
  5. Z ActivityInfo, pobierz packageNameiname
  6. Wreszcie, należy utworzyć inną intencją zz category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)isetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Wreszcie, context.startActivity(newIntent)
Gaurav Vaish
źródło
Co jeśli chciałbym otworzyć trzy oddzielne aplikacje?
Si8
7
Poniższa odpowiedź wiki społeczności jest lepsza, jeśli znasz nazwę pakietu stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk
Jak możesz przekazywać dane między aplikacją do połączeń a uruchomioną aplikacją? Znalazłem „Intent.putExtra ()”, ale nie wiem, jak odzyskać dodatkowe dane w uruchomionej aplikacji.
Bram
onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc
Gaurav Vaish
2
getPackageManager().getLaunchIntentForPackage()już robi to wszystko dla Ciebie github.com/android/platform_frameworks_base/blob/master/core/…
jrub
231

Mam taką pracę,

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

Przykładowe użycie:

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

Mam nadzieję, że to komuś pomoże.

Anonsage
źródło
5
ponieważ getLaunchIntentForPackage („nazwa pakietu aplikacji”) może powodować wyjątek.
xtr
To świetna odpowiedź, po prostu złap wyjątek i rób to, czego potrzebujesz, powiadom użytkownika itp.
IT-Dan
5
Nie być pedantem, ale nie ma powodu, aby przydzielać nową intencję w pierwszej linii, biorąc pod uwagę, że korzystasz z wyniku getLaunchIntentForPackagepołączenia.
Chris Lacy
2
getLaunchIntentForPackage()już dodaje kategorię, patrz źródło: 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);

EDYTOWAĆ :

jak sugerowano w komentarzach, dodaj jedną linię wcześniej startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
zawhtut
źródło
18
ale wymaga znajomości nazwy działania
njzk2
Próbowałem tego i otrzymałem błąd, zalecając użycie flagi FLAG_ACTIVITY_NEW_TASK. Dodałem tę linię przed startActivity i zadziałało: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze
1
@ njzk2 znalezienie nazwy pakietu czegoś w Google Play jest łatwe; znajduje się w adresie URL. Na przykład: play.google.com/store/apps/…
Da-Jin
@iceybobby tak, nazwę pakietu można łatwo znaleźć, ale jak znaleźć nazwę klasy działania do uruchomienia?
phreakhead
@phreakhead Masz rację. Myślę, że użyłem rozwiązania w tej odpowiedzi: stackoverflow.com/a/8944286/1224186, więc nazwa aktywności nie była potrzebna, więc myślę, że moja odpowiedź na njzk2 jest tutaj nieprzydatna.
Da-Jin
39

Jeśli masz już nazwę pakietu, którą chcesz aktywować, możesz użyć następującego kodu, który jest nieco bardziej ogólny:

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

Zauważyłem, że działa lepiej w przypadkach, w których główna czynność nie została znaleziona zwykłą metodą rozpoczynania działania MAIN.

Muzikant
źródło
Najlepsza odpowiedź dla mnie :-) pomocna dla mnie. Dzięki
Jalpesh Khakhi
Jest dla mnie idealny. Bardzo dziękuję Muzikant :)
Alex
13

Oto kod mojego rozwiązania bazującego na rozwiązaniu 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();
    }
}
odwrócony
źródło
10

Korzystając z rozwiązania z inversus, rozszerzyłem snippet o funkcję, która zostanie wywołana, gdy żądana aplikacja nie zostanie w danym momencie zainstalowana. Więc to działa tak: Uruchom aplikację według nazwy pakietu. Jeśli nie zostanie znaleziony, otwórz Android Market - Google Play dla tego pakietu .

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

I jest używany w ten sposób:

startApplication("org.teepee.bazant");
peter.bartos
źródło
6

Użyj tego :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Swetha
źródło
Masz jakiś pomysł? otwórz plik test.apk zamiast instalować go w magazynie urządzenia w istniejącej aplikacji. podpowiedzi po kliknięciu przycisku lunch aplikacje test.apk, które były przechowywane w istniejącym projekcie. z góry dziękuję.
Selim Raza
6

Otwórz aplikację, jeśli istnieje, lub otwórz aplikację Play Store, aby ją zainstalować:

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
źródło
powinno być if (i! = null)
vallllll
4

Aby rozpocząć inną aktywność aplikacji z mojej aktywności aplikacji. U mnie działa dobrze.

Poniższy kod zadziała, jeśli inna aplikacja jest już zainstalowana w telefonie, w przeciwnym razie nie będzie możliwe przekierowanie z jednej aplikacji do innej, więc upewnij się, że Twoja aplikacja została uruchomiona, czy nie

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
KCN
źródło
Proszę nie pisać wielu odpowiedzi, które są prawie identyczne z tym samym pytaniem. Użyj linku „edytuj” poniżej odpowiedzi i zmień oryginał.
AdrianHHH
3

// To działa na Androidzie 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
źródło
2

Ponieważ aplikacje nie mogą zmieniać wielu ustawień telefonu, możesz otworzyć działanie związane z ustawieniami tak samo, jak inną aplikację.

Spójrz na dane wyjściowe LogCat po tym, jak faktycznie ręcznie zmodyfikowałeś ustawienie:

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

Następnie użyj tego, aby wyświetlić stronę ustawień z aplikacji:

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
źródło
2

Dla poziomu API 3+ nic więcej niż jeden wiersz kodu:

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

Zwróć zamiar uruchomienia CATEGORY_INFO (aplikacje bez aktywności programu uruchamiającego, na przykład tapety, często używają tego do podania pewnych informacji o aplikacji), a jeśli go nie ma, zwraca CATEGORY_LAUNCH pakietu, jeśli istnieje.

Renascienza
źródło
2

Jeśli próbujesz rozpocząć USŁUGĘ, a nie działalność, to zadziałało:

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

Jeśli używasz metody intent.setComponent (...), jak wspomniano w innych odpowiedziach, możesz otrzymać ostrzeżenie „Niejawne intencje ze startService nie są bezpieczne”.

Dunc
źródło
2

Alternatywnie możesz również otworzyć intencję ze swojej aplikacji w innej aplikacji za pomocą:

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

gdzie urijest łącze głębokie do innej aplikacji

electrobabe
źródło
2

Użyj następujących:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
Lurzapps
źródło
2

Uruchom aplikację z innej aplikacji na Androida

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
Ashutosh Srivastava
źródło
2

Jeśli chcesz otworzyć inną aplikację, która nie jest zainstalowana, możesz wysłać ją do Google App Store w celu pobrania

  1. Najpierw utwórz na przykład metodę openOtherApp

    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.- Użytkowanie

openOtherApp(getApplicationContext(), "com.packageappname");
Vladimir Salguero
źródło
0

Wypróbuj ten kod, mam nadzieję, że to ci pomoże. Jeśli ten pakiet jest dostępny, spowoduje to otwarcie aplikacji lub otwarcie sklepu Play w celu pobrania

    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
źródło
-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
źródło