Учебное пособие по новейшему идентификационному коду мобильного телефона 2022 года (IMEI, MEID, UDID, UUID, ANDROID_ID, GAID, IDFA и т. д.)
Учебное пособие по новейшему идентификационному коду мобильного телефона 2022 года (IMEI, MEID, UDID, UUID, ANDROID_ID, GAID, IDFA и т. д.)

Статьи об Android****

1 IMEI и МЭИД

(1) IMEI

(Международный идентификационный код мобильного оборудования) — это аббревиатура Международного идентификационного кода мобильного оборудования. Международный идентификационный код мобильного оборудования можно получить только на мобильных телефонах Android. Это «электронный серийный номер», состоящий из 15 цифр, например 359881030314356. относится к каждому Каждый мобильный телефон имеет однозначное соответствие, а код уникален в мире.

Он возвращается устройством GSM и записан на материнской плате. Переустановка приложения не изменит IMEI.

(2) MEID

(Идентификатор мобильного оборудования) Идентификатор мобильного оборудования — это идентификационный код мобильного телефона CDMA, а также уникальный идентификационный код каждого мобильного телефона или планшета CDMA.

краткое содержание

IMEI — это идентификация мобильных телефонов China Unicom и China Mobile, а MEID — это идентификация мобильных телефонов Telecom.

(3) Как получить IMEI и MEID

Добавить разрешения

`

1

2

Java-код

Язык кода:javascript
копировать
//Реализуем объект TelephonyManager
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method method = telephonyManager.getClass().getMethod("getDeviceId", int.class);
//Получаем номер IMEI
String imei1 = manager.getDeviceId();
String imei2 = (String) method.invoke(manager, 1);
//Получить номер MEID
String meid = (String) method.invoke(telephonyManager, 2);`

Некоторые планшеты без функций телефона не могут получить номера IMEI и IMSI. А на некоторых устройствах getDeviceId() вернет мусорные данные.

Использование запрещено после версии Android Q(10).

2 DeviceId

Также называется идентификатором устройства. Его можно получить с помощью предоставляемого системой сервиса TelephonyManager, и он является уникальным. Сюда входят IMEI и MEID/ESN.

Обычно мы получаем DeviceId мобильного телефона, который представляет собой код IMEI мобильного телефона.

Язык кода:javascript
копировать
private String getDeviceId() {
    TelephonyManager tm = (TelephonyManager) getContext().getSystemService(Service.TELEPHONY_SERVICE);
    return tm.getDeviceId();
}

Мобильный телефон с двумя SIM-картами имеет более одного значения IMEI. Все мобильные телефоны Netcom с двумя SIM-картами имеют два IMEI и один MEID.

Использование запрещено после версии Android Q(10).

В Интернете есть способ составить 15-значное число, используя информацию об оборудовании.

Язык кода:javascript
копировать
`public static String getDeviceId()
{`
    String serial = null;
    String m_szDevIDShort = "35" +
    Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
    Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
    Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
    Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
    Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
    Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
    Build.USER.length() % 10; //13 Кусочек
    try
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            serial = android.os.Build.getSerial();
        }
        else
        {
            serial = Build.SERIAL;
        }
        //API>=9 Использовать серийный номер
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }
    catch (Exception exception)
    {
        //последовательный порт требует инициализации
        serial = "serial"; // Любая инициализация
    }
    //Число 15Кусочек, собранное с использованием аппаратной информации
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

3 мак-адреса

Идентификатор оборудования, включая MAC-адрес WiFi и Mac-адрес Bluetooth.

WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);

WifiInfowifiInfo=wifiManager.getConnectionInfo();

String mac=wifiInfo.getMacAddress();

В системе Android 6.0 этот метод не работает, возвращает константу «02:00:00:00:00:00» и определяется как вредоносное приложение.

Кроме того, вы можете легко изменить Mac-адрес с помощью эмулятора Android:

4 ANDROID_ID

ANDROID_ID — это строка из 64-значных шестнадцатеричных чисел, случайно генерируемая системой при первом запуске устройства.

String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);

1

ANDROID_ID Недостатки:

①.Значение ANDROID_ID будет сброшено при очистке устройства или восстановлении заводских настроек.

② Теперь в Интернете есть приложения, которые могут изменять значение ANDROID_ID устройства.

③ Системы, настроенные некоторыми производителями, могут привести к тому, что разные устройства будут генерировать один и тот же ANDROID_ID.

④ Системы, настроенные некоторыми производителями, могут привести к тому, что устройство вернет пустое значение ANDROID_ID.

⑤.CDMA-устройство, значения, возвращаемые ANDROID_ID и DeviceId, одинаковы.

5 UUID

(Универсальный уникальный идентификатор) Универсальный уникальный идентификационный код, который изменится после переустановки приложения.

6 OpenUDID

(Открытый уникальный идентификатор устройства) Уникальный идентификатор устройства. Даже если приложение будет переустановлено, значение останется неизменным, если только телефон не будет рутирован (чего обычные пользователи сделать не могут).

Добавьте в AndroidManifest.xml

`Метод получения OpenUDID

Язык кода:javascript
копировать
public class UDID
{`
    public static UDID getInstance()
    {
        return new UDID();
    }
    public String getUDID(Context context)
    {
        String UDID = "";
        OpenUDID_manager.sync(context);
        boolean isInitialized = OpenUDID_manager.isInitialized();
        if (isInitialized)
        {
            UDID = "Android"+ OpenUDID_manager.getOpenUDID();
        }
        return UDID;
    }
}

Другой способ создать UDID из DeviceId, ANDROID_ID и uuid.

protected static String uuid;

/**

* Получите уникальный идентификационный код

* 1. В обычных обстоятельствах его можно получить через ((TelephonyManager) s_instance.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId(). Однако на некоторых планшетах эта функция возвращает значение null;

* 2. Вы также можете получить идентификатор через Secure.getString(s_instance.getContentResolver(), Secure.ANDROID_ID); Однако есть проблемы с использованием этого на телефонах Android 2.2 или некоторых подражателях. Он будет возвращать фиксированное значение.

* 3. Если udid не получен в первых двух, то создайте случайный uuid при запуске программы и сохраните его. Это считается совместимым решением, и таких устройств, конечно, не так много.

Язык кода:javascript
копировать
` */
public synchronized static String getUDID(Context mContext)
{      if( uuid ==null )`
    {
        if( uuid == null)
        {
            final SharedPreferences prefs = mContext.getApplicationContext().getSharedPreferences( PREFS_FILE, Context.MODE_PRIVATE);
            final String id = prefs.getString(PREFS_DEVICE_ID, null );
            if (id != null)
            {
                // Use the ids previously computed and stored in the prefs file
                uuid = id;
            }
            else
            {
                final String androidId = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);
                // Use the Android ID unless it's broken, in which case fallback on deviceId,
                // unless it's not available, then fallback on a random number which we store
                // to a prefs file
                try
                {
                    if (!"9774d56d682e549c".equals(androidId))
                    {
                        uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString();
                    }
                    else
                    {
                        final String deviceId = ((TelephonyManager) mContext.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
                        uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString();
                    }
                }
                catch (UnsupportedEncodingException e)
                {
                    throw new RuntimeException(e);
                }
                // Write the value out to the prefs file
                prefs.edit().putString(PREFS_DEVICE_ID, uuid).commit();
            }
        }
    }
    return uuid;
}

7 Serial Number

Серийный номер устройства.

Как получить:

String serialNum = android.os.Build.SERIAL;

Устройство с установленной SIM-картой

getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();

Обратите внимание, что для устройств CDMA возвращается нулевое значение.

В Android 2.3 его можно получить через android.os.Build.SERIAL, а на немобильных устройствах — через этот интерфейс.

На некоторых устройствах возвращаются мусорные данные. Для устройств без возможности вызова оно может возвращать фиксированное значение.

8 IDFA

В 2014 году в Android 2.3 был запущен IDFA на основе Google Play. Его функция аналогична функции IOS: пользователи могут сбрасывать или отключать идентификатор, и пользователь сам решает, хотят ли они, чтобы его отслеживали.

Однако по некоторым причинам основные приложения, такие как Google Maps и Play, были удалены с мобильных телефонов национального банка, выпущенных в Китае. В результате IDFA невозможно получить на мобильных телефонах национального банка. (Если только пользователь не получит root права и не установит Google Play самостоятельно)

9 GAID

GAID можно получить только на телефоне Android с установленной службой Google Play.

Рекламные идентификаторы — это уникальные сбрасываемые рекламные идентификаторы для конкретных пользователей, предоставляемые Сервисом Google Play. Они дают пользователям лучший контроль, а разработчикам — простую стандартную систему для продолжения использования вашего приложения. Он используется для анонимного идентификатора в рекламных целях и для сброса идентификатора. или отказаться от участия в медицинских программах Google Play на основе интересов.

Рекламный идентификатор можно реализовать в вашем приложении через простой API.

(1) Получите SDK службы Google Play.

Найдите google-play-service.jar в библиотеке в каталоге Extras загруженного Android SDK.

(2) Интерфейс

API рекламного идентификатора доступен в библиотеке com.google.android.gms.ads.identifier в пакете сервисов Google Play. Чтобы получить рекламный идентификатор пользователя и настройки отслеживания, вызовите метод getadvertisingidinfo(), который возвращает пакет информации рекламного клиента. Текущий рекламный идентификатор пользователя и настройки отслеживания.

пример

Язык кода:javascript
копировать
`import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
// Do not call this function from the main thread. Otherwise,
// an IllegalStateException will be thrown.
public void getIdThread()
{
    Info adInfo = null;
    try
    {
        adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
    }
    catch(IOException e)
    {
        // Unrecoverable error connecting to Google Play services (e.g.,
        // the old version of the service doesn't support getting AdvertisingId).
    }
    catch(GooglePlayServicesAvailabilityException e)
    {
        // Encountered a recoverable error connecting to Google Play services.
    }
    catch(GooglePlayServicesNotAvailableException e)
    {
        // Google Play services is not available entirely.
    }
    final String id = adInfo.getId();
    final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
}`

статьи об iOS

1 IMEI

Запрещен после iOS 5. Оно написано на материнской плате и не изменится, если вы переустановите приложение.

Показыватьпример:351710058880864

  2 IDFA

Рекламный идентификатор был запущен в iOS 6. Все приложения на одном устройстве будут иметь одинаковое значение. Он специально разработан Apple для каждого поставщика рекламы для отслеживания пользователей, при этом гарантируя, что устройство пользователя не отслеживается приложением. . Могут произойти изменения, такие как сброс системы или восстановление рекламного идентификатора в настройках. Пользователи могут включить «Ограничить отслеживание рекламы» в настройках.

  ` #import <AdSupport/AdSupport.h>

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];`

Идентификаторы объявлений перегенерируются в нескольких ситуациях:

(1) Если пользователь полностью перезагружает систему (Настройка -> Универсальный -> снижение -> снижение Кусочек Местоположение и конфиденциальность) , идентификатор объявления будет создан заново.

(2) Также если пользователь явно снижаетрекламировать (Программа установки-> Универсальный -> Об этой машине -> рекламировать -> снижениерекламироватьотметка Показыватьсимвол) , то рекламный идентификатор также будет сгенерирован заново.

Показыватьпример:1E2DFA89-496A-47FD-9941-DF1FC4E6484A

3 мак-адреса

Идентификатор оборудования, включая MAC-адрес WiFi и Mac-адрес Bluetooth.iOS 7 Позже он был запрещен (вместе с OpenUDID).

  4 UDID

Используется для обозначения уникальности устройства. После iOS 6 запрещено получать собственный UDID системы, но вы можете записать его в связку ключей через uuid, чтобы получить индивидуальный UDID (несистемный собственный). Даже если пользователь переустанавливает приложение, при условии, что связка ключей есть. возвращается каждый раз , без изменений.

//UUID, устарел

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];`

Почему Apple возражает против использования разработчиками UDID

Многие разработчики связывают UDID с настоящим именем, паролем, адресом и другими данными пользователя; сетевые шпионы собирают эти данные из нескольких приложений, а затем следуют подсказкам, чтобы получить большую часть личных данных этого человека. В то же время большинство приложений часто передают UDID и личную информацию. Чтобы избежать коллективных исков, Apple, наконец, решила 5 когда,Избавьтесь от этой привычки,Разработчикам предписано сгенерировать уникальный идентификатор,Обнаруживаются только приложения,Никакой другой информации не предоставляется. Приложения, пытающиеся получить UDID, теперь запрещены и не допускаются к включению в список.

Apple рекомендует использовать UUID для создания уникальных идентификационных строк для приложений.

Полученное значение UUID не сохраняется системой, и каждый раз при вызове UUID система будет возвращать новый уникальный идентификатор. Если вы хотите сохранить этот идентификатор, вам необходимо сохранить его самостоятельно в NSUserDefaults, Keychain, Pasteboard или где-либо еще.

5 UUID

Оно изменится после переустановки приложения.

6 Как правильно получить уникальный идентификатор устройства

Постоянно сохраняйте полученный UUID в цепочке ключей устройства. Этот метод сохраняет полученный UUID в цепочке ключей при первом запуске приложения. Каждый раз при его получении проверяйте, есть ли он в локальной цепочке ключей. Если нет, вам необходимо это сделать. В нем сохраняется полученный UUID. Когда вы перезагрузите устройство, удалите приложение и установите его снова, это не повлияет на него. Однако при перепрошивке устройства связка ключей будет очищена, исчезнет и станет недействительной.

7 Что такое брелок

Используйте KeyChain для обмена данными между приложениями.

Мы можем понимать KeyChain как словарь. Все данные хранятся в форме ключ-значение. В этом словаре можно выполнить четыре операции добавления, обновления, получения и удаления. Для каждого приложения KeyChain имеет две зоны доступа: частную и общедоступную. Частная область представляет собой песочницу, и любые данные, хранящиеся в этой программе, не видны другим программам. Если вы хотите разместить сохраненный контент в общедоступной области, вам необходимо сначала объявить имя общедоступной области. В официальном документе это имя называется «группой доступа к связке ключей». Способ объявления — создать новый файл plist. случайное имя. Содержание следующее.

«yourAppID.com.yourCompany.whatever» — это имя общедоступной области, которую вы хотите назвать. За исключением поля «Как угодно», которое можно свободно задавать, остальные должны быть заполнены правдиво. Путь к этому файлу должен быть настроен в Project->build setting->Code Signing Права, в противном случае общедоступная область будет недействительной. После настройки вы должны использовать официальную подпись сертификата для ее компиляции. В противном случае появится всплывающее окно xcode, чтобы сообщить вам код. Есть проблема с подписанием. Таким образом, Apple ограничивает вас возможностью делиться данными KeyChain только с продуктами компании, а другие компании не могут получить доступ к KeyChain продуктов вашей компании.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose