Получение AndroidID в мобильном приложении

Получаем Android DeviceID в мобильном приложении/клиенте, используя стороннее приложение.

Привет сообщество! На одном из проектов у меня встала задача организовать связку 1 пользователь = 1 мобильное устройство (под управлением Android), т.е. запретить вход с разных устройств под одним пользователем. Логично, что я решил использовать AndroidID в качестве идентификатора, однако быстрый поиск в гугле меня озадачил, оказалось, что на текущий момент штатными средствами мобильной платформы его не получить. На глаза попались отличные статьи от Дмитрия Васильева (за что ему огромный респект, статьи раз, два и три), где очень подробно описано как взаимодействовать со сторонними приложениями через Intent, поэтому расписывать код не буду, смотрите исходники). Я перебрал добрый десяток приложений в маркете от самых простых до более навороченных, но так и не смог найти приложение, которое бы поддерживало передачу значения в Intent. Что же придется писать свое приложение, по сути это мое первое приложение на Android, и оно максимально простое, но свою задачу оно выполняет, определяет, а главное возвращает в 1С значение.

Главный экран приложения (для первоначального занесения идентификатора в 1С)

Код в 1С:

Функция ПолучитьIDУстройства() Экспорт

IDУстройства = Неопределено;

#Если МобильныйКлиент ИЛИ МобильноеПриложение Тогда
ЗапускПриложения = Новый ЗапускПриложенияМобильногоУстройства();
Если ЗапускПриложения.ПоддерживаетсяЗапуск() Тогда
ЗапускПриложения.Действие = "com.android.tinydeviceid.action.getDeviceID";
ЗапускПриложения.Запустить(Истина);
Для Каждого КлючЗначение Из ЗапускПриложения.ДополнительныеДанные Цикл
Если КлючЗначение.Ключ = "DeviceID" Тогда
IDУстройства = КлючЗначение.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
#КонецЕсли

Возврат IDУстройства;

КонецФункции // ПолучитьIDУстройства()

Ну и конечный результат:

В архиве само приложение (apk) и исходники, также есть на гитхабе (AntSidorov)

Надеюсь сэкономлю кому-нибудь немного времени, всем успехов!

11 Comments

  1. WKBAPKA

    а как получаете разрешение?

    Reply
  2. WKBAPKA
    public static final String getDeviceID(Context cnx) {
    String IMEINumber = «You don’t permission to access»;
    if (ActivityCompat.checkSelfPermission(cnx, android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
    TelephonyManager telephonyMgr = (TelephonyManager) cnx.getSystemService(TELEPHONY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    IMEINumber = telephonyMgr.getImei();
    } else {
    IMEINumber = telephonyMgr.getDeviceId();
    }
    }
    
    return IMEINumber;
    }

    Показать

    код получения ID в Андроид с учетом разрешений

    хорошо, что я не стал изучать мобильную платформу, зачем мне эти приколы )

    Reply
  3. sam441
    код получения ID в Андроид с учетом разрешений

    Да вроде никаких дополнительных разрешений не нужно, я использовал такой код:

    import android.provider.Settings;
    …
    String ANDROID_ID = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
    Reply
  4. sam441

    (2)

    хорошо, что я не стал изучать мобильную платформу, зачем мне эти приколы )

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

    Reply
  5. WKBAPKA

    (3) а как же это ?

    <uses-permission android:name=»android.permission.READ_PHONE_STATE» />

    должно быть по любому в манифесте

    Reply
  6. WKBAPKA

    (4) для того что бы получить IMEI нужно извращятся 🙂

    1С должна быть программой для учета, Андроид — операционной системой для мобильных устройств… лучше бы они выпустили свой SDK, потому как реализовывать некоторые интерфейсные вещи на чистом андроиде, трудозатратно.

    Reply
  7. sam441

    (5)

    должно быть по любому в манифесте

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

    <?xml version=»1.0″ encoding=»utf-8″?>
    <manifest xmlns:android=»http://schemas.android.com/apk/res/android»
    package=»com.android.tinydeviceid»>
    
    <application
    android:allowBackup=»true»
    android:icon=»@mipmap/ic_launcher»
    android:label=»@string/app_name»
    android:roundIcon=»@mipmap/ic_launcher_round»
    android:supportsRtl=»true»
    android:theme=»@style/AppTheme»>
    <activity android:name=».PrivateActivity»>
    <intent-filter>
    <action android:name=»com.android.tinydeviceid.action.getDeviceID» />
    <category android:name=»android.intent.category.DEFAULT»></category>
    </intent-filter>
    </activity>
    <activity android:name=».MainActivity»>
    <intent-filter>
    <action android:name=»android.intent.action.MAIN» />
    <category android:name=»android.intent.category.LAUNCHER» />
    </intent-filter>
    </activity>
    </application>
    
    </manifest>

    Показать

    Reply
  8. sam441

    (6)

    для того что бы получить IMEI нужно извращятся 🙂

    насчет IMEI не в курсе, я его отмел т.к. насколько я понял в 2-х симочных аппаратах их 2, не буду утверждать, но я понял так

    Reply
  9. ORlenOK22

    Как работать с архивом?

    Reply
  10. sam441

    (9)

    В архиве apk приложение ставите на свой телефон, в 1С пишите функцию (пример в статье), публикуете БД и подключаетесь к БД мобильным клиентом.

    Reply
  11. memb3r

    (5)

    (7) Начиная с версии Android 6.0 (API level 23) и выше требуется, чтобы в манифесте было прописано разрешение на определенный взаимодействия с системой. Как правильно написал WKBAPKA — нужно сделать проверку, если API >= 23, тогда сначала запрашивать разрешение у пользователя, в другом случае сразу получать идентификатор.

    https://developer.android.com/training/permissions/requesting

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *