Як перевірити програмно, встановлена ​​програма чи ні в 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.