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

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.


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);

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());
}

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();

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)");

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();

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)
        }

3

En Kotlin es simple:

val appLabel = context.applicationInfo.nonLocalizedLabel

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


1

El comentario fuente agregado a NonLocalizedLabelnos dirige ahora a:

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

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í .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.