如何获取Android应用程序ID?

114
在Android中,我如何以编程的方式获取应用程序的ID(或通过其他方法),并如何使用该ID与其他应用程序进行通信?
14个回答

189

如果你正在寻找在gradle中由applicationId定义的值,你可以简单地使用以下代码:

BuildConfig.APPLICATION_ID 

编辑于2022年:

正如评论中所指出的那样,BuildConfig.APPLICATION_ID已经被弃用,但仅适用于库。在这种情况下,应改用BuildConfig.LIBRARY_PACKAGE_NAME,详见此处.

此外,现在Context::getPackageName返回gradle中定义的applicationId的值,即使您有不同applicationId(具有唯一命名空间)的多个flavor,详见此处.


42
如果你在编写一个 Android 库,这可能并不是很有用。 - Simon Featherstone
2
我在Espresso测试中使用以下代码获取应用程序ID:private val targetContext = instrumentation.getTargetContext(),private val applictionId = targetContext.getPackageName(); - Alexei
1
@SimonFeatherstone,你最终是否找到了如何从模块中实现它的方法? - Mihai Fischer
1
@MihaiFischer,你需要创建一个函数来初始化模块/库并传递这种信息。 - Simon Featherstone
这已经被弃用,你应该使用 BuildConfig.LIBRARY_PACKAGE_NAME,如此回答 这里 - Chagai Friedlander

54
如果您提到的“应用程序ID”指的是“包名”,则可以使用方法Context :: getPackageNamehttp://developer.android.com/reference/android/content/Context.html#getPackageName%28%29)获取。
如果您想和其他应用程序进行通信,有多种方法:
1. 启动另一个应用程序的活动,并在“Intent”的“Extras”中传输数据。
2. 发送具有特定操作/类别的广播,并在extras中发送数据。
3. 如果只需要共享结构化数据,则可使用内容提供程序。
4. 如果其他应用程序需要持续在后台运行,则使用服务器并“绑定”自己到服务。
如果您能详细说明您的确切要求,社区将能够更好地帮助您。

如果我想显示应用程序列表,并且需要将ID作为整数显示,就像所有列表适配器一样,该怎么办?我可以使用安装时间,但它是长类型的。将其转换为int是否仍然有帮助? - android developer
7
在通过 build.gradle 设置包名时,包名不总是等同于应用 ID。 - Jemshit Iskenderov
6
实际上,Context.getPackageName()确实返回应用程序ID而不是包名(尽管它们通常相同)。该方法名称有些令人困惑,是因为它是遗留的。来源:https://developer.android.com/studio/build/application-id - LoPoBo
如果您使用Kotlin,Context :: getPackageName将无法正常工作,它会返回“function getPackageName(Kotlin reflection is not available)”。 - Derek Zhu
这并不是必须让你的应用程序ID与包名相同。如果applicationID与packageName设置不同,这将无法工作。 - Ariful Jannat Arif

7

我不确定你所指的“应用程序ID”是什么,但是如果你需要一个唯一标识符来表示你的应用程序,你可以使用以下方法:

从当前活动中获取 getApplication().getPackageName() 方法


2
每个安装的应用程序都有一个唯一的ID...从其他应用程序中获取应用程序的唯一ID是否可能? - arams
3
不是getApplicationContext().getPackageName()吗? - superarts.org
假设您构建了像发布版或调试版这样的版本,并且已添加后缀,例如“debug”以将其与主应用程序区分开来,在这种情况下,getPackageName()将提供原始包名称.debug。 - Aman Verma

5

获取AppId(或包名,有些人这样说)只需调用以下内容:

但请确保您导入了带有应用程序ID包路径的BuildConfig

BuildConfig.APPLICATION_ID 

3

2

1

否则,您可以获取应用程序运行的进程ID:

final static int android.os.Process.myPid()
返回此进程的标识符,可与killProcess(int)和sendSignal(int, int)一起使用。


1

我不确定您需要应用程序/安装ID的原因,但您可以在Android开发人员的一篇很棒的文章中查看现有的可能性:

总结:

  • UUID.randomUUID() 用于在应用程序首次运行后创建ID以及简单的检索
  • TelephonyManager.getDeviceId() 用于实际设备标识符
  • Settings.Secure.ANDROID_ID 在相对较新的设备上使用

0

PackageInfo.sharedUserId字段将显示在清单中分配的用户ID。

如果您希望两个应用程序具有相同的userId,以便它们可以查看彼此的数据并在同一进程中运行,则在清单中为它们分配相同的userId:

android:sharedUserId="string"

具有相同sharedUserId的两个包还需要具有相同的签名。

我也建议阅读此处以获取正确方向上的线索。


两个不同的应用程序使用相同的包名,这意味着这些应用程序可以共享数据吗? - arams
如果两个应用程序具有相同的shareUserId并且使用相同的签名进行签名,则可以共享数据。包名称不是问题。 - Will

0
如果整个目的是与其他应用程序通信数据,请使用Intent的sendBroadcast方法。

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