note для пользователей php 7, добавьте это в свой файл httpd.conf:
# PHP 7 specific configuration
<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Попробуйте следующее:
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;
}
}
Этот код не работал для меня. Работает следующий подход.
Создайте объект Intent с соответствующей информацией, а затем проверьте, является ли Intent вызываемым или нет, используя следующую функцию:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
if
заявлений! Это, безусловно, правильный ответ
– ILikeTacos
7 September 2015 в 19:44
Intent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
– DMan
5 January 2016 в 22:41
Решение для очистки (без try-catch), чем принятый ответ (на основе 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;
}
Я думаю, что использование шаблона 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;
}
Этот код проверяет, установлено ли приложение, но также проверяет, включено ли оно.
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;
}
}
Несколько более чистое решение, чем принятый ответ (на основе этот вопрос ):
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 Маркета, если приложение отсутствует, хотя следует проявлять осторожность на устройствах, которые не есть Play Store.
@ 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()
}
Если вы знаете имя пакета, то это работает без использования блока try-catch или итерации через кучу пакетов:
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();
}
Этот код используется для проверки погоды, в которой установлено ваше приложение с именем пакета, или нет, если нет, то он откроет ссылку playstore вашего приложения, иначе ваше установленное приложение
blockquote>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 ); }
Простейшая реализация с использованием Kotlin
fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
И назовите это так (поиск приложения Spotify):
packageManager.isAppInstalled("com.spotify.music")