Уникальный идентификатор устройства Android - PullRequest
42 голосов
/ 17 декабря 2010

Я хочу получить уникальный идентификатор устройства Android.Я попробовал это со следующим кодом

String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);

Однако я знаю, что это работает только для телефонов.

Что делать, если мое приложение работает на каком-то ноутбуке, нетбуке или устройстве другого типа?Как получить уникальный идентификатор в этом случае?

Ответы [ 11 ]

39 голосов
/ 17 декабря 2010

Существует три типа идентификаторов на телефоне Android.

  1. IMEI
  2. IMSI

    String ts = Context.TELEPHONY_SERVICE;
    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts);
    String imsi = mTelephonyMgr.getSubscriberId();
    String imei = mTelephonyMgr.getDeviceId();
    
  3. идентификатор Android Это 64-битная шестнадцатеричная строка, которая генерируется при первой загрузке устройства. Как правило, оно не будет изменено, если не будет выполнено восстановление заводских настроек.

    Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    
21 голосов
/ 24 апреля 2012
Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Это не будет работать для всех устройств.

У некоторых устройств Android есть проблема. Некоторые устройства возвращают значение NULL, когда мы пытаемся получить идентификатор устройства. Единственный способ решить эту проблему - создать псевдосервисный идентификатор, который должен быть сгенерирован нами. Эта функция генерирует уникальное устройство. Идентификатор для вас. Вы можете вносить изменения в эту функцию по мере необходимости. Я слишком много боролся за решение этой проблемы.

public String getDeviceID() {

/*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest");
return Return_DeviceID;*/

TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String m_szImei = TelephonyMgr.getDeviceId(); // Requires
// READ_PHONE_STATE

// 2 compute DEVICE ID
String m_szDevIDShort = "35"
+ // we make this look like a valid IMEI
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 digits
// 3 android ID - unreliable
String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
// 4 wifi manager, read MAC address - requires
// android.permission.ACCESS_WIFI_STATE or comes as null
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
// 5 Bluetooth MAC address android.permission.BLUETOOTH required
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
System.out.println("m_szBTMAC "+m_szBTMAC);

// 6 SUM THE IDs
String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
System.out.println("m_szLongID "+m_szLongID);
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
                }
m.update(m_szLongID.getBytes(), 0, m_szLongID.length());
byte p_md5Data[] = m.digest();

String m_szUniqueID = new String();
for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper
// padding)
if (b <= 0xF)
m_szUniqueID += "0";
// add number to string
m_szUniqueID += Integer.toHexString(b);
}
m_szUniqueID = m_szUniqueID.toUpperCase();

Log.i("-------------DeviceID------------", m_szUniqueID);
Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID);

return m_szUniqueID;

}
13 голосов
/ 17 декабря 2010

посмотри на постоянную ANDROID_ID в android.provider.Secure.Settings, чтобы посмотреть, поможет ли это.

Я добавляю несколько полезных ссылок из официальных документов;

12 голосов
/ 14 августа 2015

Извините, что поднял старый поток, но эта проблема вызывает у меня головную боль, я нашел хорошую статью для кого-то, чтобы прочитать, и это действительно мне очень помогает.

Иногда при разработке приложения для Android требуется получить уникальный идентификатор смартфона на базе Android. Это необходимо в тех случаях, когда пользователь хочет отслеживать уникальные установки устройства приложения.

Это также полезно в тех случаях, когда разработчик Android хочет отправлять Push-сообщения только нескольким конкретным устройствам. Поэтому здесь становится необходимым иметь UDID для каждого устройства.

В Android существует множество альтернатив UDID устройства. Некоторые методы получения UDID в приложении для Android перечислены ниже с его преимуществами и недостатками и всеми необходимыми разрешениями для получения идентификатора устройства.

  • IMEI: (международный идентификатор мобильного оборудования)
  • Идентификатор Android
  • Строка MAC-адреса WLAN
  • Строка адреса Bluetooth

1) IMEI: (международный идентификатор мобильного оборудования)

Номер IMEI является очень хорошим и основным источником для получения идентификатора устройства. Он уникален для каждого устройства и зависит от аппаратного обеспечения устройства. Таким образом, он также уникален для каждого устройства и является постоянным в течение всего срока службы устройства.

Фрагмент кода для получения IMEI устройства, как показано ниже,

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String m_deviceId = TelephonyMgr.getDeviceId();

Для этого вашему приложению потребуется разрешение «android.permission.READ_PHONE_STATE», указанное в файле манифеста.

Преимущества использования IMEI в качестве идентификатора устройства:

IMEI уникален для каждого устройства. Он остается уникальным для устройства, даже если приложение переустанавливается или устройство имеет root-права или заводские настройки.

Недостатки использования IMEI в качестве идентификатора устройства:

IMEI зависит от слота Simcard устройства, поэтому получить IMEI для устройств, которые не используют Simcard, невозможно. В устройствах Dual sim мы получаем 2 разных IMEI для одного и того же устройства, поскольку у него есть 2 слота для симкарты.

2) Идентификатор Android

Android_ID - это уникальный 64-битный номер, который генерируется и сохраняется при первой загрузке устройства. Идентификатор Android_ID стирается, когда устройство сбрасывается до заводских настроек и генерируется новое.

Код для получения Android_ID показан ниже,

String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Преимущества использования Android_ID в качестве идентификатора устройства:

Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Не нужно никакого разрешения.

Он останется уникальным на всех устройствах и работает на телефонах без слота Simcard.

Недостатки использования Android_ID в качестве идентификатора устройства:

Если версия ОС Android была обновлена ​​пользователем, это может измениться. Идентификатор изменяется, если устройство имеет root-права или на устройстве выполнен сброс к заводским настройкам. Также существует известная проблема с китайским производителем устройств Android, что некоторые устройства имеют одинаковый Android_ID.

3) Строка MAC-адреса WLAN

Мы также можем получить уникальный идентификатор для телефонов Android, используя MAC-адрес WLAN. MAC-адрес уникален для всех устройств и работает для всех типов устройств.

Фрагмент кода для получения MAC-адреса WLAN для устройства, как показано ниже,

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();

Вашему приложению потребуется разрешение «android.permission.ACCESS_WIFI_STATE», указанное в файле манифеста.

Преимущества использования MAC-адреса WLAN в качестве идентификатора устройства:

Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Он остается уникальным, если приложение переустанавливается.

Недостатки использования MAC-адреса WLAN в качестве идентификатора устройства:

Если устройство не имеет оборудования Wi-Fi, тогда вы получаете нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют оборудование Wi-Fi, и на рынке практически нет устройств без оборудования Wi-Fi.

4) Строка адреса Bluetooth

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

Фрагмент кода для получения адреса устройства Bluetooth приведен ниже,

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
String m_bluetoothAdd = m_BluetoothAdapter.getAddress();

Чтобы получить вышеуказанный код, ваше приложениетребуется разрешение «android.permission.BLUETOOTH», указанное в файле манифеста.

Преимущества использования адреса устройства Bluetooth в качестве идентификатора устройства: это уникальный идентификатор для всех типов устройств (смартфонов и планшетов).Как правило, на всех устройствах установлено одно устройство Bluetooth, и оно не изменяется.

Недостатки использования адреса устройства Bluetooth в качестве идентификатора устройства: если устройство не имеет оборудования Bluetooth, вы получаете ноль.

На мой взгляд, это несколько из лучших способов получить уникальный идентификатор устройства для смартфона Android, а также их плюсы и минусы его использования.Теперь вам решать, какой метод использовать, основываясь на требованиях разработки приложений для Android.

Если есть какие-либо другие методы для получения UDID и которые покрывают недостатки вышеуказанных методов, то я хотел бы изучитьте, в моем приложении Android.Pl.поделиться ими в поле для комментариев, а также, если какие-либо предложения или вопросы.

Вот статья

8 голосов
/ 02 августа 2011

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

http://android -developers.blogspot.com / 2011/03 / идентифицирующий-приложение-installations.html

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

Лично я считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, так как большинство из них зависят от состояния радиосвязи телефона (вкл / выкл wifi, вкл / выкл сотовой связи, вкл / выкл bluetooth). Другие, такие как Settings.Secure.ANDROID_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();
    }
}
6 голосов
/ 17 декабря 2010

Использовать MAC-адрес :

Адрес управления доступом к среде (MAC-адрес) - это уникальный идентификатор, назначенный сетевым интерфейсам

ЛюбойУстройство, подключенное к сети, гарантированно имеет MAC-адрес, и найти его на Android можно, выбрав «Настройки»> «О телефоне»> «Статус».

Вы можете получить адрес Mac с Bluetooth с помощью *.1011 * Bluetooth API .

2 голосов
/ 21 апреля 2014

Settings.Secure # ANDROID_ID возвращает идентификатор Android в виде уникальной 64-разрядной шестнадцатеричной строки.

import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID);
2 голосов
/ 17 декабря 2010

Вы можете получить MAC-адрес, если сетевое устройство (Bluetooth и т. Д.) Включено в системе (включено).Но устройство может иметь Bluetooth, WiFi и т. Д. Или ничего.

Вы можете написать собственный генератор уникальных идентификаторов (например, с 20 числами или символами случайным образом)

1 голос
/ 05 апреля 2016

Вы можете попробовать это:

String deviceId = Secure.getString(this.getContentResolver(),
                Secure.ANDROID_ID);
1 голос
/ 04 сентября 2015
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

   final String tmDevice, tmSerial, tmPhone, androidId;
   tmDevice = "" + tm.getDeviceId();
   tmSerial = "" + tm.getSimSerialNumber();
   androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

   UUID deviceUuid = new UUID(androidId.hashCode(), ((<span id="IL_AD3" class="IL_AD">long</span>)tmDevice.hashCode() << 32) | tmSerial.hashCode());
   String deviceId = deviceUuid.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...