Cara meluncurkan Aktivitas dari Aplikasi lain di Android

479

Saya ingin meluncurkan paket yang diinstal dari aplikasi Android saya. Saya berasumsi bahwa itu mungkin menggunakan niat, tetapi saya tidak menemukan cara untuk melakukannya. Apakah ada tautan, di mana menemukan informasi itu?

Bastian
sumber
2
apa yang terjadi jika saya membuka aplikasi kedua dari yang pertama dan kemudian mengklik langsung ikon aplikasi kedua, saya mendapatkan dua contoh aplikasi, yang tidak diinginkan. bagaimana cara mengelolanya ??
Radhey

Jawaban:

707

Jika Anda tidak tahu aktivitas utama, maka nama paket dapat digunakan untuk meluncurkan aplikasi.

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}
andep
sumber
5
Ada alasan mengapa ini tidak berhasil? Setidaknya aku tidak berhasil.
Simon Forsberg
22
Ini memulai Intent baru, bagaimana dengan melanjutkan aplikasi yang ada di latar belakang?
Salil Dua
3
@ andep: Ini bekerja dengan baik ketika saya menguji antara dua aplikasi yang saya buat sendiri. Setelah saya tahu nama paket apakah ini akan selalu berfungsi, atau adakah cara untuk mencegah seseorang meluncurkan aplikasi Anda (di maniefest atau di suatu tempat)?
Leonard Feehan
2
@Leonard: Kesan pertama saya, bahwa itu harus selalu berfungsi, karena nama paket bersifat publik sehingga aplikasi apa pun dapat membacanya. Dari aplikasi Anda, saya pikir Anda tidak dapat menentukan dari mana ia dipanggil tetapi aplikasi Anda dapat menentukan bahwa itu tidak dapat dipanggil melalui aktivitas utama hanya melalui layanan.
andep
1
Ya, ini bisa mengembalikan nol. "Implementasi saat ini terlihat pertama untuk aktivitas utama dalam kategori CATEGORY_INFO, dan berikutnya untuk aktivitas utama dalam kategori CATEGORY_LAUNCHER. Mengembalikan nol jika tidak ada yang ditemukan. "
quietmint
240

Saya tahu ini telah dijawab tetapi di sini adalah bagaimana saya menerapkan sesuatu yang serupa:

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

Lebih baik lagi, inilah caranya:

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

Kode duplikat dihapus:

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);
}
Jared Burrows
sumber
8
Saya mengalami masalah ketika memulai Intent ke profil Facebook atau Twitter. Mereka membuka di dalam aplikasi saya, bukan sebagai aktivitas baru. Menambahkan FLAG_ACTIVITY_NEW_TASK memperbaikinya. Terima kasih!
Harry
4
Tidak masalah! Saya mengalami masalah dengan sesuatu yang sangat mirip
Jared Burrows
1
Metode ini berfungsi untuk saya, tetapi kadang-kadang Aplikasi baru terbuka dan Aktivitas pemanggilan masih menjadi latar depan. Ada ide bagaimana cara memperbaikinya?
lgdroid57
Apakah ada cara untuk melakukan ini dari aplikasi instan?
Mahdi
Hanya berfungsi untuk versi rilis. Jika Anda mencoba membuka aplikasi debug, niat akan menjadi nol.
RexSplode
152

Saya menemukan solusinya. Dalam file manifes aplikasi saya menemukan nama paket: com.package.address dan nama aktivitas utama yang ingin saya luncurkan: MainActivity Kode berikut memulai aplikasi ini:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);
Bastian
sumber
8
saya mendapat pengecualian 'dosis yang Anda nyatakan aktivitas di Manifest.xml' Anda
itzhar
Dengan cara ini mengembalikan pengecualian yang mengatakan saya perlu mendeklarasikan aktivitas dalam manifes saya .. tetapi ini adalah aplikasi eksternal!
JJ Ab
Bagaimana cara menjalankannya di latar belakang? Berarti aplikasi yang disebut kedua tidak muncul di layar, tetapi jalankan metode onCreated ().
Dr.jacky
Saya mendapatkan kesalahan ini ketika saya mencoba dari aplikasi instan: Tidak diizinkan untuk memulai aktivitas Intent
Mahdi
@Bastian cara menutup aplikasi saat ini dari tempat yang kita sebut maksud untuk membuka aplikasi lain?
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;
}
Ahamadullah Saikat
sumber
17

Berikut adalah contoh saya meluncurkan pemindai kode batang / QR dari aplikasi saya jika seseorang menganggapnya berguna

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();
}
Tine M.
sumber
13

Edit tergantung pada komentar

Dalam beberapa versi - seperti yang disarankan dalam komentar - pengecualian yang diberikan mungkin berbeda.

Dengan demikian solusi di bawah ini sedikit dimodifikasi

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

Jawaban Asli

Meskipun dijawab dengan baik, ada implementasi yang cukup sederhana yang menangani jika aplikasi tidak diinstal. Saya melakukannya seperti ini

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

Ganti "applicationId" dengan paket yang ingin Anda buka seperti com.google.maps, dll.

mayank1513
sumber
The PackageManager.getLaunchIntentForPackage(...)kembali metode nol jika nama paket tidak diakui. Itu tidak melempar PackageManager.NameNotFoundException. Lihat di sini .
Adil Hussain
Saya baru saja mencoba startActivity(null)emulator Android 10 dan melempar NullPointerExceptiondan bukan PackageManager.NameNotFoundException.
Adil Hussain
Pada catatan saya 7 ini berfungsi persis seperti yang dimaksudkan.
mayank1513
Apa perilaku yang dimaksud dari startActivity(Intent intent)metode ketika diberikan nol Intentdan apa yang membuat Anda mengatakan itu? Dokumentasi pengembang Android hanya menyatakan bahwa ia akan melempar ActivityNotFoundException.
Adil Hussain
Hai @Adil, tolong bantu saya dengan pertanyaan ini - 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);

        }

    }
Insinyur Karima
sumber
apakah ada batasan karakter untuk metode uri.parse?
API
7

Jika Anda ingin membuka aktivitas spesifik aplikasi lain, kami dapat menggunakannya.

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

Jika Anda harus membutuhkan aplikasi lain, alih-alih menunjukkan Toast Anda dapat menampilkan dialog. Menggunakan dialog Anda dapat membawa pengguna ke Play-Store untuk mengunduh aplikasi yang diperlukan.

Vignesh KM
sumber
com.android.settings.fuelgauge.PowerUsageSummaryhanyalah aktivitas-alias dari com.android.settings.Settings$PowerUsageSummaryActivity, dan telah dihapus di Android Pie , jadi saya menyimpulkan hasil edit untuk membuat jawaban ini cocok untuk Pie. Perhatikan bahwa ini juga kompatibel dengan versi yang lebih lama, lihat komit AOSP pada 10 November 2011 af9252849fd94c1f2859c56a4010900ea38a607e dll
Akhir Pekan
3

Jika Anda mengetahui data dan tindakan paket yang diinstal bereaksi, Anda harus menambahkan informasi ini ke instance niat Anda sebelum memulainya.

Jika Anda memiliki akses ke AndroidManifest dari aplikasi lain, Anda dapat melihat semua informasi yang diperlukan di sana.

Warren Faith
sumber
1
Terima kasih balasannya. Ya saya memiliki AndroidManifest dari aplikasi lain. Apa yang saya coba lakukan sekarang adalah kode berikut: Intent intent = new Intent (Intent.ACTION_MAIN); intent.setComponent (ComponentName baru ("com.package", ". MainActivity")); startActivity (niat); tetapi dengan cara ini tidak berfungsi. Bisakah Anda memberi saya tautan yang lebih tepat, bagaimana cara melakukannya?
Bastian
1
Aplikasi macet di baris "startActivity ...": Aplikasi telah berhenti secara tidak terduga. Mohon coba lagi. Di mana saya bisa melihat kesalahan di LogCat?
Bastian
5
Saya menemukan kesalahan: Saat mengatur komponen, nama kelas yang memenuhi syarat alih-alih hanya kelas harus dinamai: intent.setComponent (ComponentName baru ("com.package", "com.package.MainActivity")) alih-alih maksud .setComponent (ComponentName baru ("com.package", ". MainActivity"))
Bastian
1
Baik untuk mengetahui ... Anda dapat menemukan LogCat saat gerhana: Window> Show view> Other, Android> Logcat
WarrenFaith
@ WarrenFaith Saya butuh dukungan dengan stackoverflow.com/questions/52335402/... Tolong bantu.
user158
2

Langkah-langkah untuk memulai aktivitas baru sebagai berikut:

1. Dapatkan niat untuk paket

2.Jika niat adalah pengalihan nol pengguna ke playstore

3.Jika niat bukan aktivitas terbuka nol

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);
    }
}
Sharath kumar
sumber
2

Dimungkinkan untuk memulai aktivitas aplikasi dengan menggunakan Intent.setClassNamesesuai dengan dokumen.

Sebuah contoh:

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)

Untuk membukanya di luar aplikasi saat ini, tambahkan bendera ini sebelum memulai niat.

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

Jawaban terkait di sini

Phani Rithvij
sumber
tolong cara menulis dalam C ++.
GeneCode
1
@GeneCode stackoverflow.com/a/22436147/8608146 mungkin membantu saya tidak pernah bekerja dengan c ++ libs di android sebelumnya.
Phani Rithvij
1
private fun openOtherApp() {
        val sendIntent = packageManager.getLaunchIntentForPackage("org.mab.dhyanaqrscanner")
        startActivity(sendIntent)
        finishAffinity()
    }
Mirza Ahmed Baig
sumber