Nous avons installé des applications par programme.
Guide moi. Je n'en ai aucune idée ... Merci.
Essayez avec ceci:
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;
}
}
Solution un peu plus propre que la réponse acceptée (basée sur cette question ):
public static boolean isAppInstalled(Context context, String packageName) {
try {
context.getPackageManager().getApplicationInfo(packageName, 0);
return true;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
J'ai choisi de le placer dans une classe d'aide en tant qu'utilitaire statique. Exemple d'utilisation:
boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");
Cette réponse montre comment obtenir l'application du Play Store si celle-ci est manquante, même si des précautions doivent être prises sur les appareils ne disposant pas du Play Store.
Le code ci-dessus n'a pas fonctionné pour moi. L'approche suivante a fonctionné.
Créez un objet d'intention avec les informations appropriées, puis vérifiez si l'intention est appelable ou non à l'aide de la fonction suivante:
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Si vous connaissez le nom du paquet, alors cela fonctionne sans utiliser de bloc try-catch ni parcourir plusieurs paquets:
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();
}
Ce code vérifie que l'application est installée, mais vérifie également qu'elle est activée.
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;
}
}
Solution plus propre (sans try-catch) que la réponse acceptée (basée sur 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;
}
Je pense que l’utilisation du motif try/catch n’est pas très bonne pour la performance. Je conseil d'utiliser ceci:
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;
}
Ce code est utilisé pour vérifier si votre application a le nom du paquet installé ou pas sinon, il ouvrira le lien playstore de votre application, sinon votre application installée
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 );
}
Une mise en oeuvre plus simple avec Kotlin
fun PackageManager.isAppInstalled(packageName: String): Boolean =
getInstalledApplications(PackageManager.GET_META_DATA)
.firstOrNull { it.packageName == packageName } != null
Et appelez-le comme ceci (recherche de l'application Spotify):
packageManager.isAppInstalled("com.spotify.music")
Une bonne réponse à d'autres problèmes ... Si vous ne voulez pas différencier "com.myapp.debug" et "com.myapp.release" par exemple!
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;
}
La réponse 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()
}
Toutes les réponses vérifient seulement que l'application est installée ou non. Mais, comme nous le savons tous, une application peut être installée mais désactivée par l'utilisateur, inutilisable.
Par conséquent, cette solution vérifie les deux. c'est-à-dire des applications installées ET activées .
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
try {
return packageManager.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
Appelez la méthode isPackageInstalled()
:
boolean isAppInstalled = isPackageInstalled("com.Android.app" , this.getPackageManager());
Maintenant, utilisez la variable booléenne isAppInstalled
et faites ce que vous voulez.
if(isAppInstalled ) {
/* do whatever you want */
}