Android: Comment obtenir une liste de installés activités, tels qu'ils apparaissent dans l'écran applications, sans doublons
Je suis en train d'écrire une application qui permet à l'utilisateur d'afficher la liste des applications installées, sélectionnez-le, puis commencer à les délais. À l'aide de didacticiels de stackoverflow, j'ai réussi à trouver comment obtenir une liste de installés activités, leurs noms de paquets et les icônes(c'est à dire ici - plusieurs façons de le faire). Juste au cas où, c'est comment j'ai commencer ses activités, il fonctionne parfaitement, pas de problème ici:
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);
Le problème est de récupérer une liste des applications installées. J'ai trouvé deux façons d'obtenir une liste des applications installées:
1) utilisation
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplication(PackageManager.GET_META_DATA)
et de chaque élément de apps
vous pouvez obtenir le nom de package et l'étiquette de l'emballage(les noms d'application).
2) utiliser
PackageManager pm = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(mainIntent, 0);
for(ResolveInfo info : resolveInfos) {
ApplicationInfo applicationInfo = info.activityInfo.applicationInfo;
//...
//get package name, icon and label from applicationInfo object
}
Il y a un problème avec première méthode: elle retourne tous les paquets installés, y compris le système de services, qui ne peuvent contenir aucune activité et ne sont donc pas exécutable. Voici une capture d'écran avec un exemple:
Tous les éléments ci-dessus qui n'ont pas d'icônes ne sont pas projetables.
Il y a un problème avec le deuxième approche ainsi: Plusieurs éléments de la liste ont des doublons:
Lorsque j'ai mis en place un point d'arrêt dans le débogueur je vois, que ces "Cartes" objets ont différentes activité de les noms ("com.google.android.cartes.MapsActivity", "com.google.android.cartes.LatitudeActivity", "com.google.android.cartes.PlacesActivity" etc.).
J'ai décidé d'utiliser la deuxième méthode, car il donne une liste qui est plus adapté à mes besoins, mais je ne peux pas trouver un moyen de filtrer les doublons et afficher uniquement l'activité par défaut de l'application, tels qu'ils apparaissent dans l'écran de lancement(vous ne voyez qu'une "Cartes" dans votre téléphone de la liste des applications, et non pas quatre). J'ai essayé de filtrage système d'apps par ApplicationInfo.FLAG_SYSTEM
, mais cela supprime de nombreuses applications que je veux avoir, y compris les Cartes et d'autres applications préinstallées. J'ai essayé d'utiliser PackageManager.MATCH_DEFAULT_ONLY
drapeau lors de l'exécution de queryIntentActivities, mais ce filtre également de nombreuses applications, ne laissant que quelques-uns.
Je suis un peu perdu ici, et je ne sais pas quoi faire. J'ai lu toutes les questions sur stackoverflow propos de la récupération de la liste des applications installées, mais cette question n'a jamais été mise en place. S'il vous plaît, aider quelqu'un? Comment puis-je récupérer une liste de lancer des applications qui n'a pas de doublons?
- Vous dites que "cette question n'a jamais été mise en place". Veuillez vérifier ceci, peut-être que cela aide: stackoverflow.com/questions/4598769/list-of-user-installed-apps/...
- Je voulais dire les doublons dans la liste, je n'ai vu personne parler de cette. Oui, j'ai vu ce commentaire, j'ai essayé de sauter des apps avec
ApplicationInfo.FLAG_SYSTEM
, mais pour une raison quelconque, cela enlève beaucoup de valide les applications, y compris des jeux et autres.
Vous devez vous connecter pour publier un commentaire.
Essayer ce code. Il répertorie uniquement les applications qui sont installés sur votre appareil.
Je suis peut être en retard, mais je viens de trouver un moyen idéal d'obtenir toutes les applications ayant lanceur & pas de dupliquer les applications (y compris le système des applications comme des contacts, des cartes, etc.).
Bien que, Satheesh la réponse pourrait être de travailler (n'ai pas vérifié moi-même), mais j'ai voulu choisir plusieurs activités si j'ai utilisé le code ci-dessous pour obtenir les applications installées.
J'ai utilisé votre deuxième approche et jetés en double packages à l'aide de HashSet.
Voici le code final :
Essayer de code ci-dessous et laissez-moi savoir ce qui s'est passé.
J'ai eu la même exigence. En fin de compte j'ai ajouté un autre état afin de filtrer la liste des applications. Je viens de vérifier si l'application a 'lanceur d'intention".
Ainsi, le code résultant ressemble à...
Les deux @Ashish Tanna et jozze sont droit, mais la performance peut-être un petit problème.
C'est la meilleure performance.
(1) Ajouter un HashSet
(2) le Juge si l'application est activée
(3) le Juge de savoir si a l'intérieur de la hashset