Android - Comment obtenir le nom de l'application? (Pas le nom du package)

120

Dans mon manifeste, j'ai:

  <application
    android:name=".MyApp"
    android:icon="@drawable/ic_launcher_icon"
    android:label="@string/app_name"
    android:debuggable="true">

Comment obtenir l'élément label?

Remarque: mon code s'exécute à l'intérieur de celui de quelqu'un d'autre, donc je n'ai pas accès à @ string / app_name

AndroidDev
la source

Réponses:

182

Il existe un moyen plus simple que les autres réponses qui ne vous oblige pas à nommer la ressource explicitement ou à vous soucier des exceptions avec des noms de package. Cela fonctionne également si vous avez utilisé une chaîne directement au lieu d'une ressource.

Faites simplement:

public static String getApplicationName(Context context) {
    ApplicationInfo applicationInfo = context.getApplicationInfo();
    int stringId = applicationInfo.labelRes;
    return stringId == 0 ? applicationInfo.nonLocalizedLabel.toString() : context.getString(stringId);
}

J'espère que cela t'aides.

Éditer

À la lumière du commentaire de Snicolas, j'ai modifié ce qui précède afin qu'il n'essaie pas de résoudre l'id s'il est 0. Au lieu de cela, il utilise, nonLocalizedLabelcomme un backoff. Pas besoin d'envelopper dans try / catch.

Darrenp
la source
3
Cela fonctionne bien, tant que vous utilisez vraiment une étiquette dans android:name. Si vous avez codé en dur une chaîne, cela échoue.
Snicolas
2
Vrai, mais le nom de l'application est généralement spécifié via une ressource de chaîne, bien sûr. Une chaîne câblée est signalée par des peluches et déconseillée.
darrenp le
1
Méfiez-vous simplement qu'il lancera une exception android.content.res.Resources $ NotFoundException si la chaîne n'est pas trouvée
zenocon
Comme conseillé par zenocon, mieux vaut le mettre dans un fichier try ... catch.
superarts.org
Savez-vous quelque chose sur le docu de nonLocalizableLabel?: "... Vous voulez probablement getApplicationLabel (ApplicationInfo)"
David
55

S'il n'est pas mentionné dans le fichier strings.xml / hardcoded dans AndroidManifest.xml pour une raison quelconque comme android: label = "MyApp"

public String getAppLable(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(context.getApplicationInfo().packageName, 0);
    } catch (final NameNotFoundException e) {
    }
    return (String) (applicationInfo != null ? packageManager.getApplicationLabel(applicationInfo) : "Unknown");
}

Ou si vous connaissez l'ID de ressource String, vous pouvez l'obtenir directement via

getString(R.string.appNameID);
Vinayak Bevinakatti
la source
en lisant le nom de l'application à partir de string.xml, parfois, je reçois des caractères indésirables. Je ne sais pas pourquoi ..Ex: à¤¸à ¥ & # 141; ठ& # 149; à ¥ & # 136; नठ°
harikrishnan
37
public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}
Frontières de la santé
la source
3
loadLabel renvoie un CharSequence. Je pense que vous avez besoin .toString()à la fin.
joshbodily
return est CharSequence ou String.valueOf ();
Heriberto Rivera
25

À partir de n'importe quelle utilisation de contexte:

getApplicationInfo().loadLabel(getPackageManager()).toString();
Zaman
la source
15

Si vous connaissez le nom du package, utilisez l'extrait de code suivant

ApplicationInfo ai;
try {
    ai = pm.getApplicationInfo(packageName, 0);
} catch (final NameNotFoundException e) {
    ai = null;
}
final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
Vipul Shah
la source
1
@RishabhTayal pm désigne l'objet PackageManager.
Vipul Shah
@VipulShah je deviens inconnu à chaque fois
nida
6

Si vous n'avez besoin que du nom de l'application, pas du nom du package, écrivez simplement ce code.

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
Pir Fahim Shah
la source
6

Dans Kotlin , utilisez les codes suivants pour obtenir le nom de l'application:

        // Get App Name
        var appName: String = ""
        val applicationInfo = this.getApplicationInfo()
        val stringId = applicationInfo.labelRes
        if (stringId == 0) {
            appName = applicationInfo.nonLocalizedLabel.toString()
        }
        else {
            appName = this.getString(stringId)
        }
Jerry Chong
la source
3

À Kotlin, c'est simple:

val appLabel = context.applicationInfo.nonLocalizedLabel
Asaf Pinhassi
la source
2

Obtenez le nom de l'application à l'aide de RunningAppProcessInfo comme:

ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while(i.hasNext()) {
  ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
  try {
    CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
    Log.w("LABEL", c.toString());
  }catch(Exception e) {
    //Name Not FOund Exception
  }
}
ρяσѕρєя K
la source
1

Le commentaire source ajouté à NonLocalizedLabelnous dirige maintenant vers:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());
Gábor
la source
0

Avez-vous essayé d'utiliser la PackageManager#getActivityInfo()méthode? Il y aura un champ qui doit contenir le nom de l'application.

Voir la réponse à une question très similaire ici .

gkiar
la source