Android - Come ottenere il nome dell'applicazione? (Non il nome del pacchetto)


120

Nel mio manifest ho:

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

Come ottengo l'elemento etichetta?

Nota: il mio codice è in esecuzione all'interno di quello di qualcun altro, quindi non ho accesso a @ string / app_name

Risposte:


182

C'è un modo più semplice rispetto alle altre risposte che non richiedono di nominare la risorsa in modo esplicito o di preoccuparsi delle eccezioni con i nomi dei pacchetti. Funziona anche se hai usato direttamente una stringa invece di una risorsa.

Basta fare:

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

Spero che questo ti aiuti.

modificare

Alla luce del commento di Snicolas, ho modificato quanto sopra in modo che non provi a risolvere l'id se è 0. Invece usa, nonLocalizedLabelcome backoff. Non c'è bisogno di avvolgere in try / catch.


3
Funziona bene, a patto che usi davvero un'etichetta in formato android:name. Se hai hardcoded una stringa, non funziona.
Snicolas

2
Vero ma il nome dell'app viene in genere specificato tramite una risorsa stringa, ovviamente. Una stringa cablata è contrassegnata da lanugine e non è consigliata.
darrenp

1
Fai solo attenzione che lancerà android.content.res.Resources $ NotFoundException se la stringa non viene trovata
zenocon

Come consigliato da zenocon, meglio inserirlo all'interno di un file try ... catch.
superarts.org

Sai qualcosa sul documento di nonLocalizableLabel ?: "... Probabilmente vuoi getApplicationLabel (ApplicationInfo)"
David

55

Se non menzionato in strings.xml / hardcoded in AndroidManifest.xml per qualsiasi motivo come 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");
}

Oppure, se conosci l'ID risorsa stringa, puoi ottenerlo direttamente tramite

getString(R.string.appNameID);

durante la lettura del nome dell'app da string.xml, a volte, ottengo caratteri spazzatura. Non so perché .. Es: à¤¸à ¥ & # 141; ठ& # 149; à ¥ & # 136; नठ°
harikrishnan

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

3
loadLabel restituisce un file CharSequence. Penso che tu abbia bisogno .toString()alla fine.
joshbodily

il ritorno è CharSequence o String.valueOf ();
Heriberto Rivera

25

Da qualsiasi contesto usa:

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

15

Se conosci il nome del pacchetto, utilizza il seguente frammento

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 denota l'oggetto PackageManager.
Vipul Shah

@VipulShah divento sconosciuto ogni volta
nida

6

Se ti serve solo il nome dell'applicazione, non il nome del pacchetto, scrivi semplicemente questo codice.

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

6

In Kotlin , utilizza i seguenti codici per ottenere il nome dell'applicazione:

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

A Kotlin è semplice:

val appLabel = context.applicationInfo.nonLocalizedLabel

2

Ottieni il nome dell'applicazione utilizzando RunningAppProcessInfo come:

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

Il commento della fonte aggiunto a NonLocalizedLabelci indirizza ora a:

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

0

Hai provato a utilizzare il PackageManager#getActivityInfo()metodo? Ci sarà un campo che dovrebbe contenere il nome dell'applicazione.

Vedi la risposta a una domanda molto simile qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.