Як отримати ідентифікатор програми Android?


92

В Android, як я можу отримати ідентифікатор програми програмно (або іншим способом), і як я можу спілкуватися з іншими програмами, використовуючи цей ідентифікатор?

Відповіді:


145

Якщо ви шукаєте значення, визначене applicationIdу gradle, ви можете просто використовувати

BuildConfig.APPLICATION_ID 

30
Це було б не так корисно, якщо ви пишете бібліотеку Android
Саймон Фезерстоун,

Я використовую це, щоб отримати applicationId у своєму тесті на еспресо: private val targetContext = instrumentation.getTargetContext () private val applicationtionId = targetContext.getPackageName ();
a_subscriber

@SimonFeatherstone ти коли-небудь дізнавався, як це зробити за допомогою модуля?
Mihai Fischer

@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!
Jemshit Iskenderov

2
На насправді, Context.getPackageName() дійсно повертає ідентифікатор додатки і НЕ ім'я пакета (хоча вони, як правило , те ж саме). Дещо заплутана назва методу - спадщина. Джерело: developer.android.com/studio/build/application-id
LoPoBo

Контекст :: getPackageName не працює, якщо ви використовуєте kotlin, він повертає "функцію getPackageName (відображення Котліна недоступне)"
Дерек Жу

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 на відносно сучасних пристроях

0

У PackageInfo.sharedUserIdполі буде показано ідентифікатор користувача, призначений у маніфесті .

Якщо ви хочете, щоб два додатки мали однаковий ідентифікатор користувача, щоб вони могли бачити дані один одного та запускатись у тому ж процесі, тоді призначте їм той самий ідентифікатор користувача в маніфесті:

android:sharedUserId="string"

Два пакети з однаковим sharedUserId теж повинні мати однаковий підпис.

Я б також порекомендував прочитати тут, щоб підштовхнути у правильному напрямку.


2 різні програми використовують однакові назви пакетів, значить, програми можуть обмінюватися даними? ...
arams

Ні. Якщо дві програми мають однаковий shareUserId І підписані однаковим підписом, можна передавати дані. Назва пакета не є проблемою.
Буде

0

Якщо основною метою є передача даних з якоюсь іншою програмою, використовуйте методи InBent sendBroadcast.


0

Якщо ви використовуєте нову систему побудови ** Gradle, тоді getPackageNameдивним чином повернеться ідентифікатор програми, а не назва пакета. Отже, відповідь MasterGaurav правильна, але йому не потрібно починати з ++

Якщо за ідентифікатором програми, ви маєте на увазі ім'я пакета ...

Детальніше про відмінності дивіться тут .

** на даний момент не настільки новий

++ Я розумію, що його відповідь мала сенс у 2011 році


0

Провідник файлів ES App ES відображає назву пакету Android у розділі Користувацькі програми, що корисно для Bitwarden. Bitwarden називає це "ідентифікатором пакета програм для Android (або назвою пакета)".


0

Щоб відстежувати встановлення, ви можете, наприклад, використовувати UUID як ідентифікатор, і просто створити новий при першому запуску програми після встановлення. Ось ескіз класу під назвою “Встановлення” з одним статичним методом Installation.id (контекст контексту). Ви можете собі уявити, як записувати більше даних, що стосуються встановлення, у файл ВСТАНОВЛЕННЯ.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.