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

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.


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);

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


25

À partir de n'importe quelle utilisation de contexte:

getApplicationInfo().loadLabel(getPackageManager()).toString();

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)");

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();

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)
        }

3

À Kotlin, c'est simple:

val appLabel = context.applicationInfo.nonLocalizedLabel

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
  }
}


1

Le commentaire source ajouté à NonLocalizedLabelnous dirige maintenant vers:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());

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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.