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

AndroidDev
quelle

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.

Darrenp
quelle
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);
Vinayak Bevinakatti
quelle
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());
}
Heidegrenzen
quelle
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();
Zaman
quelle
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)");
Vipul Shah
quelle
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();
Pir Fahim Shah
quelle
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)
        }
Jerry Chong
quelle
3

In Kotlin ist es einfach:

val appLabel = context.applicationInfo.nonLocalizedLabel
Asaf Pinhassi
quelle
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
  }
}
ρяσssρєя K.
quelle
1

Der hinzugefügte NonLocalizedLabelQuellkommentar verweist uns jetzt auf:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());
Gábor
quelle
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 .

gkiar
quelle