Android: ¿cómo obtener el nombre de la aplicación? (No es el nombre del paquete)

120

En mi manifiesto tengo:

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

¿Cómo obtengo el elemento de etiqueta?

Nota: Mi código se ejecuta dentro del de otra persona, por lo que no tengo acceso a @ string / app_name

AndroidDev
fuente

Respuestas:

182

Existe una forma más fácil que las otras respuestas que no requiere que nombre el recurso explícitamente o se preocupe por las excepciones con los nombres de los paquetes. También funciona si ha utilizado una cadena directamente en lugar de un recurso.

Solo haz:

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

Espero que esto ayude.

Editar

A la luz del comentario de Snicolas, modifiqué lo anterior para que no intente resolver la identificación si es 0. En su lugar, usa, nonLocalizedLabelcomo un retroceso. No es necesario envolver en try / catch.

darrenp
fuente
3
Esto funciona bien, siempre y cuando realmente use una etiqueta en formato android:name. Si codificó una cadena, falla.
Snicolas
2
Es cierto, pero el nombre de la aplicación generalmente se especifica a través de un recurso de cadena, por supuesto. Una cuerda cableada está marcada con pelusa y no se recomienda.
Darrenp
1
Solo tenga cuidado de que arrojará android.content.res.Resources $ NotFoundException si no se encuentra la cadena
zenocon
Como aconseja zenocon, es mejor ponerlo dentro de un archivo try ... catch.
superarts.org
¿Sabes algo sobre el documento de nonLocalizableLabel ?: "... Probablemente quieras getApplicationLabel (ApplicationInfo)"
David
55

Si no se menciona en strings.xml / codificado en AndroidManifest.xml por cualquier motivo, como 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");
}

O si conoce el ID del recurso de cadena, puede obtenerlo directamente a través de

getString(R.string.appNameID);
Vinayak Bevinakatti
fuente
mientras leo el nombre de la aplicación de string.xml, a veces, obtengo caracteres basura. No sé por qué ... Ej: à¤¸à ¥ & # 141; ठ& # 149; à ¥ & # 136; नठ°
harikrishnan
37
public static String getApplicationName(Context context) {
    return context.getApplicationInfo().loadLabel(context.getPackageManager());
}
Heath Borders
fuente
3
loadLabel devuelve un CharSequence. Creo que necesitas .toString()al final.
joshbodily
return es CharSequence o String.valueOf ();
Heriberto Rivera
25

Desde cualquier contexto de uso:

getApplicationInfo().loadLabel(getPackageManager()).toString();
zaman
fuente
15

Si conoce el nombre del paquete, utilice el siguiente fragmento

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
fuente
1
@RishabhTayal pm denota el objeto PackageManager.
Vipul Shah
@VipulShah soy cada vez desconocido
nida
6

Si solo necesita el nombre de la aplicación, no el nombre del paquete, simplemente escriba este código.

 String app_name = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
Pir Fahim Shah
fuente
6

En Kotlin , use los siguientes códigos para obtener el nombre de la aplicación:

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

En Kotlin es simple:

val appLabel = context.applicationInfo.nonLocalizedLabel
Asaf Pinhassi
fuente
2

Obtenga el nombre de la aplicación usando RunningAppProcessInfo como:

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
fuente
1

El comentario fuente agregado a NonLocalizedLabelnos dirige ahora a:

return context.getPackageManager().getApplicationLabelFormatted(context.getApplicationInfo());
Gábor
fuente
0

¿Ha intentado utilizar el PackageManager#getActivityInfo()método? Habrá un campo que debe contener el nombre de la aplicación.

Vea la respuesta a una pregunta muy similar aquí .

gkiar
fuente