如何获取Android应用程序ID?


92

在Android中,如何以编程方式(或通过其他方法)获取应用程序的ID,以及如何使用该ID与其他应用程序通信?

Answers:


143

如果您正在寻找applicationIdgradle中定义的值,则可以简单地使用

BuildConfig.APPLICATION_ID 

29
如果您正在编写Android库,这将不会那么有用
Simon Featherstone

我在Espresso测试中使用它来获取applicationId:private val targetContext = instrumentation.getTargetContext()private val applictionId = targetContext.getPackageName();
a_subscriber

@SimonFeatherstone您是否曾经从模块中找到如何做的?
米海·菲舍尔

@MihaiFischer您需要创建一个函数来初始化模块/库并传递此类信息。
西蒙·费瑟斯通

48

如果通过application id引用package name,则可以使用方法Context::getPackageNamehttp:// http://developer.android.com/reference/android/content/Context.html#getPackageName%28%29)。

如果您希望与其他应用程序进行通信,可以采用多种方法:

  1. 启动另一个应用程序的活动,并在“意图”的“其他”中发送数据
  2. 发送具有特定操作/类别的广播,并发送其他数据
  3. 如果您只需要共享结构化数据,请使用内容提供商
  4. 如果其他应用程序需要在后台连续运行,请使用Server并将自己“绑定”到该服务。

如果您能详细说明自己的要求,社区将能够为您提供更好的帮助。


如果我想显示应用程序列表,并且需要id为整数,就像所有列表适配器一样,该怎么办?我可以使用安装时间,但是它是很长的类型。将其转换为int还是有帮助的吗?
Android开发人员

4
通过build.gradle设置时,包名称并不总是applicationId!
Jemshit Iskenderov

2
实际上,Context.getPackageName() 确实返回应用程序ID而不是程序包名称(尽管它们通常是相同的)。该方法的名称有些令人困惑,它是传统的。来源:developer.android.com/studio/build/application-id
LoPoBo '19

Context :: getPackageName如果使用kotlin将不起作用,它将返回“函数getPackageName(Kotlin反射不可用)”
Derek Zhu

6

我不确定您指的是什么“应用程序ID”,但是对于您的应用程序的唯一标识符,您可以使用:

当前活动中的getApplication()。getPackageName()方法


2
每个已安装的应用程序都有一个唯一的ID ...是否有可能从其他应用程序中获得一个应用程序的唯一ID
Arams

3
是不是getApplicationContext().getPackageName()
superarts.org

假设您具有诸如发行版或调试版的构建类型,并且添加了后缀,例如“ debug”以将其与主应用程序区分开,在这种情况下,getpackageName()将为您提供原始的packagename.debug
Aman Verma



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的两个程序包也需要具有相同的签名。

我还建议您在这里阅读,以朝着正确的方向前进。


2个不同的应用程序使用相同的程序包名称意味着,这些应用程序可以共享数据吗?...
arams

否。如果两个应用程序具有相同的shareUserId并使用相同的签名进行签名,则可以共享数据。程序包名称不是问题。

0

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


0

如果您正在使用新的** Gradle构建系统,getPackageName则将奇怪地返回应用程序ID,而不是包名称。因此MasterGaurav的答案是正确的,但是他不需要从++开始

如果按应用程序ID,则表示软件包名称...

此处查看有关差异的更多信息。

**目前还不算新

++我意识到他的回答在2011年非常合理


0

Android App ES文件资源管理器在“用户应用程序”部分显示Android软件包名称,这对于Bitwarden很有用。Bitwarden将其称为“ Android应用程序软件包ID(或软件包名称)”。


0

要跟踪安装,您可以例如使用UUID作为标识符,并在安装后首次运行应用程序时简单地创建一个新的。这是一个带有一个静态方法Installation.id(Context context)的名为“ Installation”的类的草图。您可以想象将更多特定于安装的数据写入INSTALLATION文件。

public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {

    if (sID == null) {  
       File installation = new File(context.getFilesDir(), INSTALLATION);
       try {
           if (!installation.exists())
               writeInstallationFile(installation);
           sID = readInstallationFile(installation);
       } catch (Exception e) {
           throw new RuntimeException(e);
       }
    }
   return sID;
}

private static String readInstallationFile(File installation) throws IOException {
   RandomAccessFile f = new RandomAccessFile(installation, "r");
   byte[] bytes = new byte[(int) f.length()];
   f.readFully(bytes);
   f.close();
   return new String(bytes);
}

private static void writeInstallationFile(File installation) throws IOException {
   FileOutputStream out = new FileOutputStream(installation);
   String id = UUID.randomUUID().toString();
   out.write(id.getBytes());
   out.close();
}

}

可以在https://github.com/MShoaibAkram/Android-Unique-Application-ID上看到更多内容

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.