2012-06-27 14 views
78

Nel mio manifesto ho:Android: Get nome dell'applicazione (non Nome del pacchetto)

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

Come posso ottenere l'elemento etichetta? Nota: il mio codice è in esecuzione all'interno di qualcun altro, quindi non ho accesso a @ string/nome_app.

risposta

9

Se si conosce il nome del pacchetto quindi utilizzare 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)"); 
+0

Cos'è pm qui? –

+1

@RishabhTayal pm denota l'oggetto PackageManager. –

+0

@VipulShah Sto diventando sempre sconosciuto – nida

0

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

Vedere la risposta a una domanda molto simile here.

1

Diventa Appliction nome 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 
    } 
} 
119

C'è un modo più semplice rispetto alle altre risposte che non richiede di nominare la risorsa in modo esplicito o preoccuparsi di eccezioni con i nomi dei pacchetti. Funziona anche se hai usato una stringa direttamente anziché 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 aiuti.

Modifica

Alla luce del commento da Snicolas, ho modificato il precedente in modo che non tenta di risolvere l'id se è 0. Invece usa, nonLocalizedLabel come backoff. Non è necessario avvolgere in try/catch.

+3

Funziona bene, a patto che tu usi davvero un'etichetta in 'android: name'. Se hai hardcoded una stringa, allora fallisce. – Snicolas

+2

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

+1

Stai attento a gettare android.content.res.Resources $ NotFoundException se la stringa non viene trovata – zenocon

42

se non menzionati nella strings.xml/hardcoded in AndroidManifest.xml per qualsiasi ragione 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 si conosce l'ID di risorsa String allora si può direttamente ottenerlo tramite

getString(R.string.appNameID); 
+0

durante la lettura del nome app da string.xml, a volte, sto ottenendo caratteri spazzatura. Non so perché ..Ex: à¤¸à ¥  àê • à ¥ ˆ à¤¨à ° – harikrishnan

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

[loadLabel] (https://developer.android.com/reference/android/content/pm/PackageItemInfo .html # loadLabel (android.content.pm.PackageManager)) restituisce un 'CharSequence'. Penso che tu abbia bisogno di '.toString()' alla fine. – joshbodily

+0

return è CharSequence o String.valueOf(); –

5

Se è necessario solo il nome dell'applicazione, non il nome del pacchetto, quindi basta scrivere il codice.

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

da un utilizzo Contesto:

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