verificación - ¿Cómo verificar programáticamente si una aplicación está instalada o no en Android?
desactivar verificar aplicaciones android (10)
Hemos instalado aplicaciones programáticamente.
- Si la aplicación ya está instalada en el dispositivo, la aplicación se abre automáticamente.
- De lo contrario, instale la aplicación particular.
Guíame. No tengo idea. Gracias.
Prueba esto
Este código se usa para verificar si su aplicación tiene instalado el nombre del paquete o no, de lo contrario, abrirá el enlace de la tienda de juegos de su aplicación, de lo contrario su aplicación instalada
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 );
}
Creo que usar el patrón try / catch no es muy bueno para el rendimiento. Yo aconsejo usar esto:
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;
}
El código anterior no funcionó para mí. El siguiente enfoque funcionó.
Cree un objeto Intento con información apropiada y luego verifique si el Intento es invocable o no usando la siguiente función:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Este código verifica que la aplicación esté instalada, pero también verifica que esté habilitada.
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;
}
}
Prueba con esto:
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;
}
}
Respuesta de @Egemen Hamutçu en 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()
}
Si conoce el nombre del paquete, entonces esto funciona sin usar un bloque try-catch o iterar a través de un grupo de paquetes:
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();
}
Solución algo más limpia que la respuesta aceptada (basada en esta pregunta ):
public static boolean isAppInstalled(Context context, String packageName) {
try {
context.getPackageManager().getApplicationInfo(packageName, 0);
return true;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
Elegí ponerlo en una clase auxiliar como una utilidad estática. Ejemplo de uso:
boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");
Esta respuesta muestra cómo obtener la aplicación de Play Store si falta la aplicación, aunque se debe tener cuidado en los dispositivos que no tienen Play Store.
Solución más limpia (sin try-catch) que la respuesta aceptada (basada en AndroidRate Library ):
public static boolean isPackageExists(Context context, String targetPackage) {
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(0);
for (ApplicationInfo packageInfo : packages) {
if (packageInfo.packageName.equals(targetPackage)) {
return true;
}
}
return false;
}
Una implementación más simple usando Kotlin
fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
Y llámalo así (buscando la aplicación Spotify):
packageManager.isAppInstalled("com.spotify.music")