Android-如何获得应用程序名称? (非包名称)

在我的货单上有:

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

如何获取 label 元素?

注意: 我的代码在别人的代码中运行,所以我不能访问@string/app _ name

141772 次浏览

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

参见一个非常类似的问题的答案。

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

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

只要做:

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,它就不会尝试解析 id。相反,它使用 nonLocalizedLabel作为后退。在 try/catch 中不需要包装。

如果没有在 AndroidManifest.xml 中的 strings.xml/hardcode 中提到,不管出于什么原因,比如 android: label = “ MyApp”

爪哇咖啡

public String getAppLable(Context context) {
ApplicationInfo applicationInfo = null;
try {
applicationInfo = context.packageManager.getApplicationInfo(context.getPackageManager().getApplicationInfo().packageName, 0);
} catch (final NameNotFoundException e) {
Log.d("TAG", "The package with the given name cannot be found on the system.");
}
return (applicationInfo != null ? packageManager.getApplicationLabel(applicationInfo) : "Unknown");
}

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

getString(R.string.appNameID);

更新

科特林

fun getAppLable(context: Context): String? {
var applicationInfo: ApplicationInfo? = null
try {
applicationInfo = context.packageManager.getApplicationInfo(context.applicationInfo.packageName, 0)
} catch (e: NameNotFoundException) {
Log.d("TAG", "The package with the given name cannot be found on the system.")
}
return (if (applicationInfo != null) packageManager.getApplicationLabel(applicationInfo) else "Unknown")
}

爪哇咖啡

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

Kotlin (作为扩展)

fun Context.getAppName(): String = applicationInfo.loadLabel(packageManager).toString()

如果您只需要应用程序名称,而不需要包名称,那么只需编写这段代码。

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

来自任何上下文的使用:

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

好了,伙计们,另一个时髦的选择是

Application.Context.ApplicationInfo.NonLocalizedLabel

在应用程序元素上验证硬编码的 android 标签。

<application android:label="Big App"></application>

参考文献: Http://developer.android.com/reference/android/content/pm/packageiteminfo.html#nonlocalizedlabel

增加到 NonLocalizedLabel的来源评论指示我们:

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

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

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

在 Kotlin,道理很简单:

val appLabel = context.applicationInfo.nonLocalizedLabel.toString()

默认情况下,您有一个由 AndroidStudio 生成的名为“ app _ name”的字符串资源。为什么不直接利用这一点呢?或为此目的创建的任何其他字符串资源。比调用几个内部方法来得到一个必须首先设置的值要容易得多。

你可以用这个

JAVA

ApplicationInfo appInfo = getApplicationContext().getApplicationInfo();
String applicationLabel = getApplicationContext().getPackageManager().getApplicationLabel(appInfo).toString();

科特林

一个用于获取 kotlin 中应用程序名称的简单函数

fun getApplicationName() : String{
var applicationName = ""
try {
val applicationInfo = application.applicationInfo
val stringId = applicationInfo.labelRes
if (stringId == 0) {
applicationName = applicationInfo.nonLocalizedLabel.toString()
}
else {
applicationName = application.getString(stringId)
}
} catch (e: Exception) {
e.printStackTrace()
}
return applicationName
}

如果“ don’t have access”意味着您没有得到预期的值..:

String appName = getString(R.string.app_name);