Подтвердить что ты не робот

Уникальный идентификатор Android-устройства

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

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

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

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

4b9b3361

Ответ 2

На телефоне Android есть три типа идентификаторов.

  • IMEI
  • IMSI

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

    Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    

Ответ 3

Secure.getString(getContentResolver(), Secure.ANDROID_ID);

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

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

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;

}

Ответ 4

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

Иногда во время разработки приложений 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 уникален для каждого устройства. Он остается уникальным для устройства, даже если приложение переустановлено или если устройство коренится или factory reset.

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

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

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

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

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

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

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

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

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

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

Если версия ОС Android обновляется пользователем, это может измениться. Идентификатор изменяется, если устройство коренится или factory reset выполняется на устройстве. Также существует известная проблема с китайским производителем 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 в качестве идентификатора устройства:

Если устройство не имеет wifi-оборудования, тогда вы получаете нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют wifi-аппаратное обеспечение, и на рынке почти нет устройств без оборудования 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. обмениваться данными в поле комментариев, а также при любых предложениях или запросах.

Здесь статья

Ответ 5

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

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

Кажется, что лучше всего создать для себя один из них при установке, а затем прочитать его при повторном запуске приложения.

Я лично считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, работает во всех случаях, поскольку большинство из них зависит от состояний радиотелефона (включение/выключение Wi-Fi, включение/выключение соты, включение/выключение 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

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

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

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

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

Ответ 7

Я не могу писать комментарии сейчас, поэтому пишу здесь.

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

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

Ответ 8

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

import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID);

Ответ 9

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();

Ответ 10

Вы можете попробовать следующее:

String deviceId = Secure.getString(this.getContentResolver(),
                Secure.ANDROID_ID);

Ответ 11

TextView textAndroidId = (TextView)findViewById(R.id.androidid);
String AndroidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
textAndroidId.setText("My ID is: " + AndroidId);