Android-如何获取应用程序名称?(不是包名)


120

在我的清单中,我有:

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

如何获得标签元素?

注意:我的代码正在其他人的内部运行,因此我无权访问@ string / app_name

Answers:


182

有一个比其他答案更简单的方法,它不需要您显式命名资源或担心包名称的异常。如果您直接使用字符串而不是资源,它也可以使用。

做就是了:

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

希望这可以帮助。

编辑

根据Snicolas的评论,我对上面的内容进行了修改,以便它不会尝试解析ID为0的情况。相反,它使用nonLocalizedLabel作为回退。无需在try / catch中进行换行。


3
只要您确实在中使用标签,此方法就可以正常工作android:name。如果您对字符串进行硬编码,则它将失败。
Snicolas 2013年

2
是的,但是应用名称通常是通过字符串资源指定的。硬连线的字符串由皮棉标记,不建议使用。
darrenp

1
请注意,如果找不到该字符串,它将抛出android.content.res.Resources $ NotFoundException
zenocon 2014年

根据zenocon的建议,最好将其放在内try ... catch
superarts.org 2016年

您是否了解nonLocalizableLabel文档的内容?:“ ...您可能想要getApplicationLabel(ApplicationInfo)”
David

55

如果出于诸如android:label =“ MyApp”之类的原因未在AndroidManifest.xml的strings.xml / hardcoded中提及

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

或者,如果您知道String资源ID,则可以直接通过

getString(R.string.appNameID);

从string.xml读取应用名称时,有时会出现垃圾字符。我不知道为什么..例如:सà¥&#141;à¤&#149;à¥&#136;नर
harikrishnan

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

3
loadLabel返回一个CharSequence。我认为您最后需要.toString()
joshbodily

返回是CharSequence或String.valueOf();
Heriberto Rivera

25

在任何上下文中使用:

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

15

如果您知道软件包名称,请使用以下代码段

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表示PackageManager对象。
Vipul Shah

@VipulShah我每次都变得陌生
奈达(Nida)2015年


6

Kotlin中,使用以下代码获取应用程序名称:

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


2

使用RunningAppProcessInfo获取应用名称:

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

添加到的源注释NonLocalizedLabel现在将我们定向到:

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

0

您是否尝试过使用该PackageManager#getActivityInfo()方法?将有一个字段,其中应包含应用程序的名称。

这里查看非常相似的问题的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.