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


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

}

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.


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

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

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

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

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

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
}

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

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

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

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

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

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
  }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.