Android'de Başka Bir Uygulamadan Etkinlik Başlatma


478

Yüklü bir paketi Android uygulamamdan başlatmak istiyorum. Amaçları kullanmanın mümkün olduğunu düşünüyorum, ama bunu yapmanın bir yolunu bulamadım. Bilgiyi nerede bulacağınız bir bağlantı var mı?


2
İlk uygulamadan ikinci uygulamayı açar ve doğrudan ikinci uygulamanın simgesini tıklatırsam ne olur, uygulamanın istenmeyen iki örneğini alırım. nasıl yönetilir?
Radhey

Yanıtlar:


707

Ana etkinliği bilmiyorsanız, uygulamayı başlatmak için paket adı kullanılabilir.

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}

5
Bunun neden işe yaramayacağına dair herhangi bir neden var mı? En azından işe yaramadı.
Simon Forsberg

22
Yeni bir Niyet başlar, arka planda olan uygulamayı sürdürmeye ne dersiniz?
Salil Dua

3
@andep: Kendim oluşturduğum iki uygulama arasında test yaptığımda bu benim için iyi çalıştı. Paket adını öğrendikten sonra bu her zaman işe yarayacak mı, yoksa birisinin uygulamanızı başlatmasını engellemenin bir yolu var mı?
Leonard Feehan

2
@Leonard: Her zaman çalışması gerektiği konusunda ilk izlenimim, çünkü paket adları herkese açıktır, böylece tüm uygulamalar bunları okuyabilir. Uygulamalarınızdan, nereden çağrıldığını belirleyemeyeceğinizi düşünüyorum, ancak uygulamanız, yalnızca hizmetler yoluyla ana etkinlik aracılığıyla çağrılamayacağını belirleyebilir.
andep

1
Evet, bu null değerini döndürebilir. "Bir ana kategoride faaliyet için ilk Mevcut uygulama görünüyor CATEGORY_INFOve kategorisinde bir ana aktivite için bir sonraki CATEGORY_LAUNCHER. Ne bulunursa null değerini döndürür. "
quietmint

239

Bunun cevaplandığını biliyorum ama işte benzer bir şeyi nasıl uyguladığım:

Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
    // We found the activity now start the activity
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
} else {
    // Bring user to the market or let them choose an app?
    intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("market://details?id=" + "com.package.name"));
    startActivity(intent);
}

Daha da iyisi, işte yöntem:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent != null) {
        // We found the activity now start the activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } else {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("market://details?id=" + packageName));
        context.startActivity(intent);
    }
}

Yinelenen kod kaldırıldı:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent == null) {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=" + packageName));
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

8
Bir Facebook veya Twitter profiline Niyet başlatırken sorun yaşıyordum. Uygulamamın içinde yeni bir etkinlik olarak açılıyorlardı. FLAG_ACTIVITY_NEW_TASK eklemek bunu düzeltti. Teşekkürler!
Harry

4
Sorun değil! Çok benzer bir şeyle ilgili sorun yaşıyordum
Jared Burrows

1
Yöntem benim için çalışıyor, ancak bazen yeni Uygulama açık ve çağıran Etkinlik hala ön planda. Nasıl düzeltebileceğine dair bir fikrin var mı?
lgdroid57

Anında uygulamadan bunu yapmanın bir yolu var mı?
Mehdi

Yalnızca yayın sürümlerinde çalışır. Hata ayıklama uygulamasını açmaya çalışıyorsanız, amaç boş olacaktır.
RexSplode

152

Çözümü buldum. Uygulamanın bildirim dosyasında paket adını buldum: com.package.address ve başlatmak istediğim ana etkinliğin adı: MainActivity Aşağıdaki kod bu uygulamayı başlatır:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);

8
'Manifest.xml'de aktivite beyan ettiğin doz' istisnası var '
itzhar

Bu şekilde benim manifest faaliyet bildirmek gerektiğini söyleyen bir istisna döndürür .. ama bu harici bir uygulama!
JJ Ab

Arka planda nasıl çalıştırılır? İkinci olarak adlandırılan uygulamalar ekranda gösterilmez, ancak onCreated () yöntemini çalıştırır.
Dr.jacky

Anlık uygulamadan denediğimde bu hatayı alıyorum: Etkinlik başlatmak için izin verilmiyor Niyet
Mehdi

@Bastian başka bir uygulama açmak niyetini çağırdığımız mevcut uygulama nasıl kapatılır?
Arnold Brown

18
// in onCreate method
String appName = "Gmail";
String packageName = "com.google.android.gm";
openApp(context, appName, packageName);

public static void openApp(Context context, String appName, String packageName) {
    if (isAppInstalled(context, packageName))
        if (isAppEnabled(context, packageName))
            context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
        else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
    else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}

private static boolean isAppInstalled(Context context, String packageName) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException ignored) {
    }
    return false;
}

private static boolean isAppEnabled(Context context, String packageName) {
    boolean appStatus = false;
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
        if (ai != null) {
            appStatus = ai.enabled;
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return appStatus;
}

17

Birisi yararlı buluyorsa, uygulamamdan bar / QR kod tarayıcısını başlatma örneğim

Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");

try 
{
    startActivityForResult(intent, SCAN_REQUEST_CODE);
} 
catch (ActivityNotFoundException e) 
{
    //implement prompt dialog asking user to download the package
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this);
    downloadDialog.setTitle(stringTitle);
    downloadDialog.setMessage(stringMessage);
    downloadDialog.setPositiveButton("yes",
            new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialogInterface, int i) 
                {
                    Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    try
                    {
                        myActivity.this.startActivity(intent);
                    }
                    catch (ActivityNotFoundException e)
                    {
                        Dialogs.this.showAlert("ERROR", "Google Play Market not found!");
                    }
                }
            });
    downloadDialog.setNegativeButton("no",
            new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialog, int i) 
                {
                    dialog.dismiss();
                }
            });
    downloadDialog.show();
}

13

Yoruma bağlı olarak düzenleme

Bazı sürümlerde - yorumlarda belirtildiği gibi - atılan istisna farklı olabilir.

Böylece aşağıdaki çözüm biraz değiştirilir

Intent launchIntent = null;
try{
   launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}

if(launchIntent == null){
    startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
    startActivity(launchIntent);
}

Orijinal Yanıt

İyi cevaplanmış olmasına rağmen, uygulama yüklü değilse işleyen oldukça basit bir uygulama var. Böyle yaparım

try{
    startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
    startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}

"ApplicationId" ifadesini com.google.maps vb. Gibi açmak istediğiniz paketle değiştirin.


PackageManager.getLaunchIntentForPackage(...)Paket adı tanınan değilse yöntem döndürür boş. Atmıyor PackageManager.NameNotFoundException. Buraya bakın .
Adil Hussain

Ben sadece startActivity(null)bir Android 10 emülatörü üzerinde denedim ve a a NullPointerExceptiondeğil a atar PackageManager.NameNotFoundException.
Adil Hussain

Notum 7'de tam olarak tasarlandığı şekilde çalışıyor.
mayank1513

startActivity(Intent intent)Boş değer verildiğinde yöntemin amaçlanan davranışı Intentnedir ve bunu size söyleten nedir? Android geliştiricilerinin belgeleri yalnızca bir ActivityNotFoundException.
Adil Hussain

Merhaba @Adil bana bu soruda yardımcı olabilir misiniz - stackoverflow.com/q/59615815/9640177
mayank1513

7
// check for the app if it exist in the phone it will lunch it otherwise, it will search for the app in google play app in the phone and to avoid any crash, if no google play app installed in the phone, it will search for the app in the google play store using the browser : 

 public void onLunchAnotherApp() {

        final String appPackageName = getApplicationContext().getPackageName();

        Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName);
        if (intent != null) {

            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

        } else {

            onGoToAnotherInAppStore(intent, appPackageName);

        }

    }

    public void onGoToAnotherInAppStore(Intent intent, String appPackageName) {

        try {

            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("market://details?id=" + appPackageName));
            startActivity(intent);

        } catch (android.content.ActivityNotFoundException anfe) {

            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName));
            startActivity(intent);

        }

    }

uri.parse yönteminde bir karakter sınırı var mı?
API

7

Başka bir uygulamanın belirli bir etkinliğini açmak istiyorsanız bunu kullanabiliriz.

Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try 
{
    startActivity(intent)
}catch(ActivityNotFoundException e){
    Toast.makeText(context,"Activity Not Found",Toast.LENGTH_SHORT).show()
}

Başka bir uygulamaya ihtiyacınız varsa, Tost'u göstermek yerine bir iletişim kutusu gösterebilirsiniz. İletişim kutusunu kullanarak gerekli uygulamayı indirmek için kullanıcıyı Play-Store'a getirebilirsiniz.


com.android.settings.fuelgauge.PowerUsageSummarySadece bir olan etkinlik-takma ait com.android.settings.Settings$PowerUsageSummaryActivity, ve kuruldu Android Pie çıkarıldı Bu cevap elbise Pie yapmak için düzenlemek zirvesine yüzden. Ayrıca eski sürümle de uyumlu olduğunu unutmayın, bkz.10 Kasım 2011 tarihinde AOSP taahhüdü af9252849fd94c1f2859c56a4010900ea38a607e vb
Hafta Sonu

3

Yüklü paketin tepki verdiği verileri ve eylemi biliyorsanız, başlatmadan önce bu bilgileri niyet örneğinize eklemeniz yeterlidir.

Diğer uygulamanın AndroidManifest'ine erişiminiz varsa, gerekli tüm bilgileri orada görebilirsiniz.


1
Yanıtınız için teşekkürler. Evet diğer uygulamanın AndroidManifest var. Şimdi yapmaya çalıştığım şu kod: Intent intent = new Intent (Intent.ACTION_MAIN); intent.setComponent (yeni BileşenAdı ("com.package", ". MainActivity")); startActivity (niyet); ama bu şekilde çalışmıyor. Bana daha kesin bir bağlantı verebilir misiniz, nasıl yapılır?
Bastian

1
Uygulama "startActivity ..." satırında kilitleniyor: Uygulama beklenmedik bir şekilde durdu. Lütfen tekrar deneyin. LogCat'te hatayı nerede görebilirim?
Bastian

5
Hatayı buldum: Bileşeni ayarlarken, yalnızca sınıf yerine tam nitelikli sınıf adı adlandırılmalıdır: intent.setComponent (new ComponentName ("com.package", "com.package.MainActivity")) niyet yerine .setComponent (yeni BileşenAdı ("com.package", ". MainActivity"))
Bastian

1
Bilmenizde fayda var ... LogCat'i tutulmada bulabilirsiniz: Pencere> Görünümü göster> Diğer, Android> Logcat
WarrenFaith

Birlikte desteklemek gerek @WarrenFaith stackoverflow.com/questions/52335402/... yardım lütfen.
user158

2

Yeni etkinlik başlatma adımları aşağıdaki gibidir:

1. paket için niyet alın

2.Kullanma null olursa PlayStore'a yönlendirme

3.Kent null açık etkinlik değilse

public void launchNewActivity(Context context, String packageName) {
    Intent intent = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) {
        intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    }
    if (intent == null) {
        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 (android.content.ActivityNotFoundException anfe) {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
        }
    } else {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

2

Kullanarak bir uygulamanın etkinliğini başlatmak mümkündür Intent.setClassNameDokümanlara göre .

Bir örnek:

val activityName = "com.google.android.apps.muzei.MuzeiActivity" // target activity name
val packageName = "net.nurik.roman.muzei" // target package's name
val intent = Intent().setClassName(packageName, activityName)
startActivity(intent)

Geçerli uygulamanın dışında açmak için, amacı başlatmadan önce bu bayrağı ekleyin.

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

İlgili bir cevap burada


pls nasıl yazılır C ++.
GeneCode

1
@GeneCode stackoverflow.com/a/22436147/8608146 Android'de c ++ libs ile daha önce hiç çalışmamıştım.
Phani Rithvij

1
private fun openOtherApp() {
        val sendIntent = packageManager.getLaunchIntentForPackage("org.mab.dhyanaqrscanner")
        startActivity(sendIntent)
        finishAffinity()
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.