Как получить идентификатор приложения для Android?

93

В Android, как мне получить идентификатор приложения программно (или каким-либо другим способом) и как я могу общаться с другими приложениями, используя этот идентификатор?

Арамс
источник

Ответы:

146

Если вы ищете значение, определенное applicationIdв gradle, вы можете просто использовать

BuildConfig.APPLICATION_ID 
Джереми
источник
30
Это было бы не так полезно, если вы пишете библиотеку для Android,
Саймон Фезерстоун,
1
Я использую это, чтобы получить applicationId в моем тесте Espresso: private val targetContext = Instrumentation.getTargetContext () private val applicationId = targetContext.getPackageName ();
a_subscriber
1
@SimonFeatherstone вы когда-нибудь узнали, как это сделать из модуля?
Михай Фишер
1
@MihaiFischer вам нужно создать функцию для инициализации модуля / библиотеки и затем передать такую ​​информацию.
Саймон Фезерстоун
48

Если application idвы имеете в виду package name, вы можете использовать метод Context::getPackageName( http: // http: //developer.android.com/reference/android/content/Context.html#getPackageName%28%29 ).

Если вы хотите общаться с другим приложением, есть несколько способов:

  1. Запустить действие другого приложения и отправить данные в «Дополнительно» «Намерения»
  2. Отправьте трансляцию с определенным действием / категорией и отправьте данные в дополнительных услугах
  3. Если вам просто нужно поделиться структурированными данными, используйте поставщика контента
  4. Если другое приложение должно постоянно работать в фоновом режиме, используйте сервер и «привяжите» себя к службе.

Если вы сможете сформулировать свое точное требование, сообщество сможет вам лучше помочь.

Гаурав Вайш
источник
Что делать, если я хочу показать список приложений, и мне нужно иметь идентификатор в виде целого числа, как и все адаптеры списков? Я мог бы использовать время установки, но оно длинное. Поможет ли приведение к int?
разработчик Android
4
имя пакета не всегда applicationId, когда вы устанавливаете его через build.gradle!
Джемшит Искендеров
3
На самом деле, Context.getPackageName() действительно возвращает идентификатор приложения и не имя пакета (хотя они, как правило , то же самое). Несколько сбивающее с толку название метода - legacy. Источник: developer.android.com/studio/build/application-id
LoPoBo 01
Context :: getPackageName не работает, если вы используете kotlin, он возвращает «function getPackageName (отражение в Kotlin недоступно)»
Дерек Чжу
6

Я не уверен, какой «идентификатор приложения» вы имеете в виду, но для уникального идентификатора вашего приложения вы можете использовать:

getApplication (). getPackageName () из вашего текущего действия

рефлог
источник
2
каждое установленное приложение имеет уникальный идентификатор ... можно ли получить уникальный идентификатор приложения из другого приложения
arams
3
Не так ли getApplicationContext().getPackageName()?
superarts.org
Предположим, у вас есть типы сборки, такие как выпуск или отладка, и вы добавили суффикс, например, «отладка», чтобы отличать его от основного приложения, в этом случае getpackageName () предоставит вам originalpackagename.debug
Aman Verma
1

В противном случае вы можете получить идентификатор процесса, в котором работает ваше приложение:

final static int android.os.Process.myPid ()
Возвращает идентификатор этого процесса, который можно использовать с killProcess (int) и sendSignal (int, int).

Тони Фролов
источник
1

Я не уверен, для чего вам нужен идентификатор приложения / установки, но вы можете просмотреть существующие возможности в отличной статье от разработчиков Android:

Подводить итоги:

  • UUID.randomUUID() для создания идентификатора при первом запуске приложения после установки и простого получения впоследствии
  • TelephonyManager.getDeviceId() для фактического идентификатора устройства
  • Settings.Secure.ANDROID_ID на относительно современных устройствах
youri
источник
0

В PackageInfo.sharedUserIdполе будет отображаться идентификатор пользователя, назначенный в манифесте .

Если вы хотите, чтобы у двух приложений был один и тот же идентификатор пользователя, чтобы они могли видеть данные друг друга и работать в одном процессе, назначьте им один и тот же идентификатор пользователя в манифесте:

android:sharedUserId="string"

Два пакета с одинаковым sharedUserId также должны иметь одинаковую подпись.

Я также рекомендую прочитать здесь, чтобы подтолкнуть вас в правильном направлении.

Будет
источник
Два
Нет. Если два приложения имеют одинаковый shareUserId И подписаны одной и той же подписью, они могут обмениваться данными. Имя пакета не является проблемой.
Will
0

Если вся цель состоит в том, чтобы обмениваться данными с каким-либо другим приложением, используйте методы sendBroadcast Intent.

Адвантей
источник
0

Если вы используете новую систему сборки ** Gradle, то getPackageNameстранным образом возвращает идентификатор приложения, а не имя пакета. Итак, ответ MasterGaurav правильный, но ему не нужно начинать с ++

Если по идентификатору приложения вы имеете в виду имя пакета ...

Узнайте больше о различиях здесь .

** не так уж и ново на данный момент

++ Я понимаю, что его ответ имел смысл в 2011 году

tir38
источник
0

Android App ES File Explorer показывает имя пакета Android в разделе «Пользовательские приложения», что полезно для Bitwarden. Bitwarden называет это «идентификатором пакета приложения Android (или именем пакета)».

Крис Гуд
источник
0

Для отслеживания установок вы можете, например, использовать UUID в качестве идентификатора и просто создать новый при первом запуске приложения после установки. Вот эскиз класса с именем «Установка» с одним статическим методом Installation.id (контекст контекста). Вы можете представить себе запись дополнительных данных, связанных с установкой, в файл 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

Шоаиб Акрам
источник
0

Чтобы получить AppId (или имя пакета, как говорят некоторые), просто вызовите это:

Но убедитесь, что вы импортируете BuildConfigс помощью пути пакетов идентификатора приложения

BuildConfig.APPLICATION_ID 
Мопто
источник