Як перевірити програмно, встановлена ​​програма чи ні в Android?


147

Ми встановили програми програмно.

  1. Якщо програма вже встановлена ​​на пристрої, програма відкриється автоматично.
  2. В іншому випадку встановіть конкретну програму.

Веди мене. Я поняття не маю. Дякую.


Відповіді:


317

Спробуйте з цим:

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: Я сподіваюсь, що це може вам допомогти
— Aerrow

1
Без сумніву, ваша публікація дуже корисна, але я отримую виняток "java.lang.RuntimeException: Додавання вікна не вдалося" та "E / AndroidRuntime (7554): Викликано: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): на android.os.BinderProxy.transact (Native Method) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): на android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): at android.view.ViewRootImpl.setView (ViewRootImpl.java:194) "
— DJhon

2
@BlueGreen: Привіт, сподіваюсь, що це посилання може вам допомогти, stackoverflow.com/questions/11451393/… , інакше, якщо ви використовуєте Dialog Class, це означає, будь ласка, перевірте це. :)
— Aerrow

1
@ Привіт. Припустимо, я перевіряю, чи встановлено .apk чи ні? під час встановлення ... Я отримую той самий виняток під час перевірки пакету com.test.installedornot.My .apk розмір більше 9 МБ, то в такому випадку як я буду керувати цим винятком?
— DJhon

@BlueGreen: вищевказаний код перевірятиме лише встановлений додаток, на момент встановлення це не працюватиме. Для вашого випадку використовуйте приймач широкомовної передачі, щоб отримати сповіщення після встановлення apk.
— Aerrow

65

Дещо більш чисте рішення, ніж прийнята відповідь (виходячи з цього питання ):

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

Я вирішив поставити його в хелперний клас як статичну утиліту. Приклад використання:

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

Ця відповідь показує, як отримати додаток із Play Store, якщо його немає, хоча потрібно бути обережним на пристроях, у яких немає Play Store.


для цього потрібні якісь конкретні дозволи для Android?
— Bootstrapper

@Bootstrapper: Ні, він не потребує спеціальних дозволів.
— Jonik

Дякую (робоче рішення)
— Naveed Ahmad

26

Наведений вище код не працював для мене. Наступний підхід спрацював.

Створіть об'єкт наміру з відповідною інформацією, а потім перевірте, чи має намір дзвонити або не використовуючи таку функцію:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}

5
Це краще, оскільки не потрібно використовувати винятки для контролю потоку!
— QED

2
@QED - це жахливо кількість людей, які використовують Винятки як ifзаяви! Це, безумовно, правильна відповідь
— ILikeTacos

1
який зміст наміру? Рядок з пакетомName не працює
— Анріке де Суса

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
— Dominic K

Якщо програму було вимкнено, це має бути неправильним.
— Гюго

15

Якщо ви знаєте назву пакета, це працює, не використовуючи блок-пробування чи повторення через купу пакетів:

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();буде більш привітним у стилі java
— headsvk

7

Цей код перевіряє, щоб переконатися, що додаток встановлено, але також перевіряє його активність.

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

Це назва пакету програми. Наприклад, "com.example.apps.myapp". Я відредагував свою відповідь, щоб показати пакетName замість урі.
— youravgjoe

3

Я думаю, що використання моделі try / catch не дуже добре для продуктивності. Раджу скористатися цим:

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

Вищенаведений код у kotlin `` `приватна забава isAppInstalled (контекст: контекст, урі: String): булева {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) повернути пакетInfoList.asSequence (=. Filterge {it ?pacge? = uri} .any ()} `` `
— Кішань Б

3

Більш чисте рішення (без спроб), ніж прийнята відповідь (заснована на бібліотеці AndroidRate ):

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

Перевірте, чи додаток встановлено чи не в Android, використовуючи kotlin.

Створення розширення kotlin.

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

Тепер можна перевірити, встановлено чи ні додаток

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

1

Спробуйте це

Цей код використовується для перевірки встановлення погоди, коли ваша програма із назвою пакета встановлена ​​чи ні, якщо ні, то вона відкриє посилання playstore для вашої програми, інакше ваш встановлений додаток

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

Простіша реалізація за допомогою Kotlin

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

І називайте це так (шукаючи додаток Spotify):

packageManager.isAppInstalled("com.spotify.music")

0

Відповідь @Egemen Hamutçu в 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

Усі відповіді лише перевіряють, встановлений чи не встановлений додаток. Але, як ми всі знаємо, додаток можна встановити, але користувачем відключити, непридатним.

Тому це рішення перевіряє обидва. тобто встановлені програми з підтримкою AND .

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

Викличте метод isPackageInstalled():

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

Тепер використовуйте булеву змінну isAppInstalledі робіть все, що завгодно.

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

0

Класна відповідь на інші проблеми. Якщо ви не хочете, наприклад, розмежовувати "com.myapp.debug" та "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

Так приємніше з Котлін сугером:

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

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.