Periksa apakah aplikasi diinstal - Android

104

Saya mencoba memasang aplikasi dari Google Play. Saya dapat memahami bahwa saat membuka URL toko Google Play, itu membuka Google Play dan ketika saya menekan tombol kembali, aktivitas dilanjutkan.

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

Ketika saya kembali ke aktivitas, saya mencoba menelepon ini onResume()untuk memeriksa apakah aplikasi telah diinstal, tetapi saya menerima kesalahan:

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

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

Kesalahannya adalah sebagai berikut:

E / AndroidRuntime (796): java.lang.RuntimeException: Tidak dapat memulai aktivitas ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: Tidak ada Aktivitas ditemukan untuk menangani Intent {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Saya kira aktivitasnya onPause(). Apakah ada cara yang lebih baik untuk menerapkannya? Saya mencoba memeriksa apakah aplikasi telah selesai dipasang.

Siddharthan Asokan
sumber
kemungkinan duplikat Mendeteksi aplikasi diinstal atau tidak?
Philipp Jahoda
@SiddharthanAsokan Jika saya mengerti dengan benar, apa yang ingin Anda capai di sini adalah, mulai aplikasi Anda -> buka play store-> klik instal -> kembali ke aktivitas Anda sendiri -> mulai aplikasi yang baru diinstal .. benar?
Varun
Tidak kembali ke aplikasi yang awalnya saya buka. Saya perlu mendapatkan beberapa info tentang aplikasi yang diinstal menggunakan PackageManager. Pengambilan informasi ini dimulai setelah saya menginstal aplikasi dari awal yang digunakan membuka url web.
Siddharthan Asokan

Jawaban:

299

Coba ini:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Ia mencoba untuk mengambil informasi tentang paket yang namanya Anda kirimkan. Gagal jika, jika NameNotFoundExceptiondilempar, itu berarti tidak ada paket dengan nama itu yang diinstal, jadi kami mengembalikannya false.

Perhatikan bahwa kami meneruskan a, PackageManagerbukan a Context, sehingga metode ini sedikit lebih fleksibel dapat digunakan dan tidak melanggar hukum Demeter . Anda dapat menggunakan metode ini tanpa akses ke sebuah Contextinstance, selama Anda memiliki sebuah PackageManagerinstance.

Gunakan seperti ini:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}
Robin Kanters
sumber
1
Syaratnya: Saya perlu memeriksa proses instalasi ini jika sudah selesai. Saya klik instal dan sementara itu saya mencoba untuk memeriksa instalasi dalam satu lingkaran. Kode baik-baik saja tetapi metode untuk memeriksa apakah instalasi selesai adalah yang saya cari.
Siddharthan Asokan
3
@SiddharthanAsokan Anda dapat menggunakan penerima siaran untuk tindakan package_added.
Varun
@Varun Saya baru saja mengedit kodenya. Tidak ada lagi nama paket aplikasi yang saya gunakan. Hanya url web aplikasi di Google Play Store
Siddharthan Asokan
@Robin Kanters Tolong lakukan tinjau perubahan yang saya buat
Siddharthan Asokan
Apa yang Anda lakukan dalam pertanyaan Anda sama dengan jawaban saya.
Robin Kanters
32

Jawaban Robin Kanters benar, tetapi itu memeriksa aplikasi yang diinstal terlepas dari statusnya diaktifkan atau dinonaktifkan.

Kita semua tahu bahwa aplikasi dapat dipasang tetapi dinonaktifkan oleh pengguna, oleh karena itu tidak dapat digunakan.

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

Anda dapat meletakkan metode ini di kelas seperti Utilsdan memanggilnya di mana-mana menggunakan:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
Antonio Papalillo
sumber
5

Coba ini:

public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =   mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Gopi Cg
sumber
5

Solusi lebih cepat:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGidslebih murah dari getPackageInfo, sehingga bekerja lebih cepat.

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

Catatan: Ini tidak akan berfungsi di beberapa ruang virtual. Mereka bisa melanggar Android API dan selalu mengembalikan larik, meskipun tidak ada aplikasi dengan nama paket itu.
Dalam kasus ini, gunakan getPackageInfo.

Enyby
sumber
0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}
DEVSHK
sumber
0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// metode untuk memeriksa paket yang diinstal benar / salah

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }
Faakhir
sumber
0

Jika Anda ingin mencobanya tanpa blok try catch, dapat menggunakan metode berikut, Buat maksud dan setel paket aplikasi yang ingin Anda verifikasi.

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

dan panggil metode berikut untuk memeriksa apakah aplikasi telah diinstal

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}
ked
sumber
0

Mereka yang mencari solusi Kotlin dapat menggunakan metode ini,

Di sini saya telah membagikan kode lengkap, dan juga menangani status yang diaktifkan. Periksa Apakah Aplikasi Diinstal di Android Kotlin

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }
Asad Ali Choudhry
sumber
-9
@Override 
protected void onResume() {
    super.onResume();
    boolean installed = false;

    while (!installed) {
        installed = appInstalledOrNot (APPPACKAGE);
        if (installed) {
            Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
        }
    }
} 

private boolean appInstalledOrNot (String uri) {
    PackageManager pm = getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}
Pertho
sumber
8
Ini adalah putaran tak terbatas.
Robin Kanters