从Android清单中获取包名

13

这应该很简单,但我找不到任何相关信息...

我只想读取Android Manifest中的包值...

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="THIS"

原因很简单,我需要调用context.getResources().getIdentifier(...)函数,并且我需要包名。

由于这段代码将在其他应用程序中被重复使用,我希望在导出时能够保证它是傻瓜式的,因此不必每次更改该值。

有人知道如何做到这一点吗?


https://dev59.com/jGw15IYBdhLWcg3weLoF#51479130 - user1506104
2个回答

18

在一个Activity中,你可以直接调用getPackageName()方法。如果你需要来自manifest的额外数据,你可以使用PackageInfo类:http://developer.android.com/reference/android/content/pm/PackageInfo.html

将TextView设置为您的应用程序版本的示例:

    try {
        PackageManager pm = getPackageManager();
        PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0);
        TextView version = (TextView) findViewById(R.id.version);
        version.setText(packageInfo.versionName);
    } catch (NameNotFoundException e) {}

2
这似乎并不完全正确,因为packageInfo.versionName返回的是在gradle文件中定义的applicationId而不是您清单中的package属性。在大多数情况下,这是相同的,它将正常工作,但是当您使用更改应用程序ID的buildFlavors时,这将不再起作用。我也没有找到任何解决方案,但可以通过R类访问package属性,即package属性仅影响R类的包名称,而不是应用程序ID或普通类包。 - da_berni

2

从你的“主要”Activity类:

String package = this.getClass().getPackage().getName();

7
值得注意的是,这仅在您的主活动位于与清单包相同名称的包中时才有效(例如,而不是子包)。 - Richard Tingle
类的包名不能与清单文件中定义的包名匹配,因此这是不正确的。尽管在大多数情况下这样做可以工作。 - da_berni
这将使事情清楚明了。https://dev59.com/jGw15IYBdhLWcg3weLoF#51479130 - user1506104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接