Bagaimana cara mengecek secara terprogram apakah suatu aplikasi diinstal atau tidak di Android?

147

Kami telah menginstal aplikasi secara terprogram.

  1. Jika aplikasi sudah diinstal di perangkat, aplikasi terbuka secara otomatis.
  2. Kalau tidak, instal aplikasi tertentu.

Bimbing aku. Saya tidak punya ide. Terima kasih.

Sathish Sathish
sumber
Kemungkinan duplikat Android - periksa keberadaan aplikasi lain
noelicus

Jawaban:

317

Coba dengan ini:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}
Aerrow
sumber
1
@Sathish: Saya harap ini dapat membantu Anda
Aerrow
1
Tidak diragukan posting Anda sangat membantu, tetapi saya mendapatkan pengecualian "java.lang.RuntimeException: Menambahkan jendela gagal" dan "E / AndroidRuntime (7554): Disebabkan oleh: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): di android.os.BinderProxy.transact (Metode Asli) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): di android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): di android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon
2
@BlueGreen: Hai, harap tautan ini dapat membantu Anda, stackoverflow.com/questions/11451393/... , jika Anda menggunakan Kelas Dialog, silakan periksa. :)
Aerrow
1
@Arrow .. Misalkan saya memeriksa .apk saya diinstal atau tidak? pada saat instalasi ... Saya mendapatkan pengecualian yang sama saat memeriksa paket saya com.test.installedornot.My. Ukuran .apk lebih dari 9MB lalu dalam hal ini bagaimana saya akan mengelola pengecualian ini?
DJhon
@BlueGreen: Kode di atas hanya akan memeriksa aplikasi yang diinstal, pada saat instalasi ini tidak akan berfungsi. Untuk kasus Anda, gunakan penerima Siaran untuk mendapatkan notifikasi setelah apk itu diinstal.
Aerrow
65

Solusi yang agak lebih bersih daripada jawaban yang diterima (berdasarkan pertanyaan ini ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Saya memilih untuk meletakkannya di kelas pembantu sebagai utilitas statis. Contoh penggunaan:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

Jawaban ini menunjukkan cara mendapatkan aplikasi dari Play Store jika aplikasi tersebut tidak ada, meskipun harus berhati-hati pada perangkat yang tidak memiliki Play Store.

Jonik
sumber
apakah ini memerlukan izin Android spesifik untuk berfungsi?
Bootstrapper
@ Bootstrapper: Tidak, tidak memerlukan izin khusus.
Jonik
Terima kasih (Solusi Bekerja)
Naveed Ahmad
26

Kode di atas tidak berfungsi untuk saya. Pendekatan berikut berhasil.

Buat objek Intent dengan info yang sesuai dan kemudian periksa apakah Intent dapat dipanggil atau tidak menggunakan fungsi berikut:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}
Priyank Desai
sumber
5
Ini lebih baik karena tidak perlu menggunakan pengecualian untuk kontrol aliran!
QED
2
@ QED itu mengejutkan jumlah orang yang menggunakan Pengecualian sebagai ifpernyataan! Ini jelas jawaban yang tepat
ILikeTacos
1
apa isi Intent? String dengan packageName tidak berfungsi
Henrique de Sousa
3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K
Jika aplikasi dinonaktifkan, itu pasti salah.
Hugo
15

Jika Anda tahu nama paket, maka ini berfungsi tanpa menggunakan blok coba-tangkap atau beralih melalui banyak paket:

public static boolean isPackageInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(packageName);
    if (intent == null) {
        return false;
    }
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}
Kavi
sumber
1
return !list.isEmpty();akan lebih ramah gaya java
headsvk
7

Kode ini memeriksa untuk memastikan aplikasi diinstal, tetapi juga memeriksa untuk memastikan aplikasi itu diaktifkan.

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}
youravgoe
sumber
Ini nama paket aplikasi. Misalnya, "com.example.apps.myapp". Saya telah mengedit jawaban saya untuk menampilkan packageName alih-alih uri.
youravgjoe
3

Saya pikir menggunakan pola coba / tangkap tidak terlalu baik untuk kinerja. Saya menyarankan untuk menggunakan ini:

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}
Egemen Hamutçu
sumber
Kode di atas dalam kotlin `` `private fun isAppInstalled (konteks: Konteks, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} `` `
Kishan B
3

Solusi yang lebih bersih (tanpa try-catch) daripada jawaban yang diterima (berdasarkan AndroidRate Library ):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}
Alexander Savin
sumber
2

Periksa Aplikasi diinstal atau tidak di Android dengan menggunakan kotlin.

Membuat ekstensi kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Sekarang, dapat memeriksa apakah aplikasi diinstal atau tidak

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}
Neeraj Dhameliya
sumber
1

Coba ini

Kode ini digunakan untuk memeriksa cuaca aplikasi Anda dengan nama paket diinstal atau tidak jika tidak maka itu akan membuka tautan playstore dari aplikasi Anda jika tidak, aplikasi Anda yang terinstal

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }
Sunil
sumber
1

Implementasi yang lebih sederhana menggunakan Kotlin

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

Dan menyebutnya seperti ini (mencari aplikasi Spotify):

packageManager.isAppInstalled("com.spotify.music")
Víctor Albertos
sumber
0

@Egemen Hamutçu menjawab di kotlin B-)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }
Kishan B
sumber
0

Semua jawaban hanya memeriksa aplikasi tertentu diinstal atau tidak. Tapi, seperti kita ketahui aplikasi dapat diinstal tetapi dinonaktifkan oleh pengguna, tidak dapat digunakan.

Oleh karena itu, solusi ini memeriksa keduanya. yaitu, aplikasi yang diinstal DAN diaktifkan .

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
     try {
          return packageManager.getApplicationInfo(packageName, 0).enabled;
     }
     catch (PackageManager.NameNotFoundException e) {
          return false;
     }
}

Panggil metode isPackageInstalled():

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

Sekarang, gunakan variabel boolean isAppInstalleddan lakukan apa pun yang Anda inginkan.

if(isAppInstalled ) {
    /* do whatever you want */
}
Aashish
sumber
0

Jawaban keren untuk masalah lain. Misalnya, jika Anda tidak ingin membedakan "com.myapp.debug" dan "com.myapp.release"!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}
Nicolas Duponchel
sumber
0

Jadi lebih baik dengan suger Kotlin:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
David
sumber