Android - Como obter o nome do aplicativo? (Não é o nome do pacote)


120

No meu manifesto, tenho:

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

Como obtenho o elemento label?

Nota: Meu código está sendo executado dentro do de outra pessoa, portanto, não tenho acesso a @ string / app_name

Respostas:


182

Há uma maneira mais fácil do que as outras respostas que não exigem que você nomeie o recurso explicitamente ou se preocupe com exceções com nomes de pacotes. Também funciona se você tiver usado uma string diretamente em vez de um recurso.

Apenas faça:

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 isto ajude.

Editar

À luz do comentário de Snicolas, modifiquei o item acima para que ele não tente resolver o id se for 0. Em vez disso, ele usa nonLocalizedLabelcomo backoff. Não há necessidade de empacotar na tentativa / captura.


3
Isso funciona bem, desde que você realmente use uma etiqueta android:name. Se você codificou uma string, ela falhará.
Snicolas

2
Verdadeiro, mas o nome do aplicativo geralmente é especificado por meio de um recurso de sequência, é claro. Uma corda com fio é sinalizada por fiapos e não é recomendada.
darrenp

1
Apenas tome cuidado para que ele jogue android.content.res.Resources $ NotFoundException se a string não for encontrada
zenocon

Conforme recomendado pelo zenocon, é melhor colocá-lo dentro de a try ... catch.
superarts.org 26/02

Você sabe alguma coisa sobre o docu de nonLocalizableLabel ?: "... Você provavelmente quer getApplicationLabel (ApplicationInfo)"
David

55

Se não for mencionado no arquivo strings.xml / codificado no AndroidManifest.xml por qualquer 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");
}

Ou, se você souber o ID do recurso String, poderá obtê-lo diretamente via

getString(R.string.appNameID);

ao ler o Nome do aplicativo em string.xml, às vezes, estou obtendo caracteres indesejados. Eu não sei porque ..Ex: à¤¸à ¥ & # 141; å¤ & # 149; à ¥ & # 136; नठ°
Harikrishnan

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

3
loadLabel retorna a CharSequence. Eu acho que você precisa .toString()no final.
Joshbodily 22/03

return é CharSequence ou String.valueOf ();
Heriberto Rivera

25

De qualquer uso do Contexto:

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

15

Se você souber o nome do pacote, use o seguinte trecho

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 indica o objeto PackageManager.
Vipul Shah

@VipulShah eu estou ficando desconhecido todas as vezes
nida

6

Se você precisar apenas do nome do aplicativo, não do nome do pacote, basta escrever este código.

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

6

No Kotlin , use os seguintes códigos para obter o Nome do Aplicativo:

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

No Kotlin é simples:

val appLabel = context.applicationInfo.nonLocalizedLabel

2

Obter nome da aplicação 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

O comentário da fonte adicionado a NonLocalizedLabelnos direciona agora para:

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

0

Você já tentou usar o PackageManager#getActivityInfo()método? Haverá um campo que deve conter o nome do aplicativo.

Veja a resposta para uma pergunta muito semelhante aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.