Проверьте, установлено ли приложение-Android
Я пытаюсь установить приложения из Google Play. Я могу понять, что при открытии URL-адреса Google Play store он открывает Google Play, и когда я нажимаю кнопку "Назад", активность возобновляется.
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);
когда я вернулся к деятельности, я попытался вызвать это onResume() чтобы проверить, если приложение установлено, но я получаю сообщение об ошибке:
@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 ;
}
ошибка заключается в следующем:
E / AndroidRuntime (796): java.ленг.RuntimeException: не удается запустить
деятельность
ComponentInfo{com.образец.appinstaller / com.образец.appinstaller.MainActivity}:
андроид.содержание.ActivityNotFoundException:
Никакой активности не обнаружено, обращаться с намерением { акт=андроид.намерение.действие.ВИД
дат=на рынке://подробности?ИД=ком.пакет.название ФЛГ=0x40080000 }
Я думаю, что активность onPause(). Есть ли лучший способ реализовать это? Я пытаюсь проверить, если приложение завершило установку.
5 ответов:
попробуйте это:
private boolean isPackageInstalled(String packagename, PackageManager packageManager) { try { packageManager.getPackageInfo(packagename, 0); return true; } catch (NameNotFoundException e) { return false; } }он пытается получить информацию о пакете, имя которого вы передали. В противном случае, если
NameNotFoundExceptionбыл брошен, это означает, что пакет с таким именем не установлен, поэтому мы возвращаемfalse.обратите внимание, что мы передаем в
PackageManagerвместоContext, так что метод немного более гибко использовать и не нарушает закон Деметры. Вы можете использовать этот метод без доступа кContextэкземпляр, пока у вас естьPackageManagerэкземпляра.используйте его так:
public void someMethod() { // ... PackageManager pm = context.getPackageManager(); boolean isInstalled = isPackageInstalled("com.somepackage.name", pm); // ... }
ответ Робина Кантерса правильный, но он проверяет установленные приложения независимо от их включенного или отключенного состояния.
мы все знаем, что приложение может быть установлено, но отключено пользователем, поэтому непригодно для использования.
Это проверяет наличие установленных и включить приложения:
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) { try { return packageManager.getApplicationInfo(packageName, 0).enabled; } catch (PackageManager.NameNotFoundException e) { return false; } }вы можете поместить этот метод в класс
Utilsи называйте его везде, используя:boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
попробуйте это:
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; }
более быстрое решение:
private boolean isPackageInstalled(String packagename, PackageManager packageManager) { try { packageManager.getPackageGids(packagename); return true; } catch (NameNotFoundException e) { return false; } }
getPackageGidsдешевле отgetPackageInfo, Так что это работает быстрее.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Примечание: это не будет работать в каком-то виртуальном пространстве. Они могут нарушить API Android и всегда возвращать массив, даже если нет приложения с этим именем пакета.
В этом случае используйтеgetPackageInfo.
@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; }
Comments