Android - Wie erhalte ich den Anwendungsnamen? (Nicht Paketname)


120

In meinem Manifest habe ich:

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

Wie bekomme ich das Label-Element?

Hinweis: Mein Code wird in einem anderen Code ausgeführt, sodass ich keinen Zugriff auf @ string / app_name habe

Antworten:


182

Es gibt einen einfacheren Weg als die anderen Antworten, bei dem Sie die Ressource nicht explizit benennen oder sich über Ausnahmen mit Paketnamen Gedanken machen müssen. Dies funktioniert auch, wenn Sie eine Zeichenfolge direkt anstelle einer Ressource verwendet haben.

Mach einfach:

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

Hoffe das hilft.

Bearbeiten

In Anbetracht des Kommentars von Snicolas habe ich das oben Gesagte so geändert, dass nicht versucht wird, die ID aufzulösen, wenn sie 0 ist. Stattdessen wird sie nonLocalizedLabelals Backoff verwendet. Keine Notwendigkeit, in try / catch einzuwickeln.


3
Dies funktioniert einwandfrei, solange Sie wirklich ein Etikett verwenden android:name. Wenn Sie eine Zeichenfolge fest codiert haben, schlägt dies fehl.
Snicolas

2
True, aber der App-Name wird normalerweise normalerweise über eine String-Ressource angegeben. Eine fest verdrahtete Schnur wird durch Flusen gekennzeichnet und nicht empfohlen.
Darrenp

1
Achten Sie nur darauf, dass android.content.res.Resources $ NotFoundException ausgelöst wird, wenn die Zeichenfolge nicht gefunden wird
zenocon

Wie von zenocon empfohlen, legen Sie es besser in a try ... catch.
Superarts.org

Wissen Sie etwas über das Dokument von nonLocalizableLabel?: "... Sie möchten wahrscheinlich getApplicationLabel (ApplicationInfo)"
David

55

Wenn nicht in der Datei strings.xml / hardcoded in AndroidManifest.xml aus irgendeinem Grund wie android erwähnt: 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");
}

Wenn Sie die String-Ressourcen-ID kennen, können Sie sie direkt über abrufen

getString(R.string.appNameID);

Beim Lesen des App-Namens aus string.xml werden manchmal Junk-Zeichen angezeigt. Ich weiß nicht , warum ..Ex: à¤¸à ¥ & # 141; å¤ & # 149; à ¥ & # 136; नठ°
Harikrishnan

37
public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}

3
loadLabel gibt a zurück CharSequence. Ich denke du brauchst .toString()am Ende.
Joshbodily

return ist CharSequence oder String.valueOf ();
Heriberto Rivera

25

Verwenden Sie aus jedem Kontext:

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

15

Wenn Sie den Paketnamen kennen, verwenden Sie das folgende Snippet

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 bezeichnet das PackageManager-Objekt.
Vipul Shah

@VipulShah Ich werde jedes Mal unbekannt
Nida

6

Wenn Sie nur den Anwendungsnamen und nicht den Paketnamen benötigen, schreiben Sie einfach diesen Code.

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();

6

Verwenden Sie in Kotlin die folgenden Codes, um den Anwendungsnamen abzurufen:

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

In Kotlin ist es einfach:

val appLabel = context.applicationInfo.nonLocalizedLabel

2

Abrufen des Anwendungsnamens mithilfe von RunningAppProcessInfo wie folgt:

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

Der hinzugefügte NonLocalizedLabelQuellkommentar verweist uns jetzt auf:

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

0

Haben Sie versucht, die PackageManager#getActivityInfo() Methode zu verwenden? Es wird ein Feld geben, das den Namen der Anwendung enthalten sollte.

Die Antwort auf eine sehr ähnliche Frage finden Sie hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.