Android - jak uzyskać nazwę aplikacji? (Nie nazwa pakietu)

120

W swoim manifeście mam:

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

Jak uzyskać element etykiety?

Uwaga: mój kod działa wewnątrz cudzego kodu, więc nie mam dostępu do @ string / app_name

AndroidDev
źródło

Odpowiedzi:

182

Jest łatwiejszy sposób niż inne odpowiedzi, który nie wymaga jawnego nazwania zasobu ani martwienia się o wyjątki z nazwami pakietów. Działa również, jeśli użyłeś bezpośrednio łańcucha zamiast zasobu.

Po prostu zrób:

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

Mam nadzieję że to pomoże.

Edytować

W świetle komentarza Snicolasa, zmodyfikowałem powyższe, aby nie próbowało rozwiązywać identyfikatora, jeśli jest równe 0. Zamiast tego używa go nonLocalizedLabeljako wycofania. Nie ma potrzeby pakowania w try / catch.

darrenp
źródło
3
Działa to dobrze, o ile naprawdę używasz etykiety w android:name. Jeśli zakodowałeś ciąg na sztywno, to się nie powiedzie.
Snicolas
2
To prawda, ale nazwa aplikacji jest zwykle określana za pomocą zasobu ciągu. Sznur podłączony na stałe jest oznaczony kłaczkami i nie jest zalecany.
darrenp
1
Tylko uważaj, jeśli ciąg nie zostanie znaleziony, wyrzuci android.content.res.Resources $ NotFoundException
zenocon
Zgodnie z zaleceniami zenocon, lepiej umieść go w pliku try ... catch.
superarts.org
Czy wiesz coś o dokumentacji nonLocalizableLabel ?: „... Prawdopodobnie chcesz getApplicationLabel (ApplicationInfo)”
David
55

Jeśli nie jest wymienione w strings.xml / hardcoded w AndroidManifest.xml z dowolnego powodu, na przykład 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");
}

Lub jeśli znasz identyfikator zasobu String, możesz go uzyskać bezpośrednio za pośrednictwem

getString(R.string.appNameID);
Vinayak Bevinakatti
źródło
podczas czytania nazwy aplikacji z string.xml, czasami otrzymuję niepotrzebne znaki. Nie wiem dlaczego ... Ex: à¤¸à ¥ & # 141; ठ& # 149; à ¥ & # 136; नठ°
harikrishnan
37
public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}
Heath Borders
źródło
3
loadLabel zwraca plik CharSequence. Myślę, że .toString()na końcu potrzebujesz .
joshbodily
return to CharSequence lub String.valueOf ();
Heriberto Rivera
25

Z dowolnego użycia kontekstu:

getApplicationInfo().loadLabel(getPackageManager()).toString();
zaman
źródło
15

Jeśli znasz nazwę pakietu, użyj następującego fragmentu

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
źródło
1
@RishabhTayal pm oznacza obiekt PackageManager.
Vipul Shah
@VipulShah jestem nieznany za każdym razem
nida
6

Jeśli potrzebujesz tylko nazwy aplikacji, a nie nazwy pakietu, po prostu napisz ten kod.

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
Pir Fahim Shah
źródło
6

W Kotlinie użyj następujących kodów, aby uzyskać nazwę aplikacji:

        // 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
źródło
3

W Kotlinie jest to proste:

val appLabel = context.applicationInfo.nonLocalizedLabel
Asaf Pinhassi
źródło
2

Uzyskaj nazwę aplikacji przy użyciu RunningAppProcessInfo jako:

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
źródło
1

Komentarz źródłowy dodany do NonLocalizedLabelkieruje nas teraz do:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());
Gábor
źródło
0

Czy próbowałeś użyć tej PackageManager#getActivityInfo()metody? Pojawi się pole, które powinno zawierać nazwę aplikacji.

Zobacz odpowiedź na bardzo podobne pytanie tutaj .

gkiar
źródło