2010-12-17 38 views
40

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

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

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

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

+2

@Mudassir: Так что в основном вы хотите что-то, что 'установить в камне', 'жестко', который никогда не будет изменить и на 100% надежнее ??? Intel попробовала ... прочитайте это schneier.com/essay-187.html – Squonk 2010-12-17 08:00:17

+0

@MisterSquonk Я хочу что-то подобное. Мне нравится «в камне». :-) – Mudassir 2010-12-17 08:43:50

+0

@ Мудассир: Хорошо, удачи в том, чтобы найти это, но я был бы удивлен, если вы его найдете. В лучшем случае я буду работать над принципом того, что наименее вероятно будет изменено/взломано или что угодно, чтобы использовать его как основу для чего-то, что является «уникальным», как может быть. После этого попробуйте написать код, чтобы компенсировать любые проблемы на этом пути. – Squonk 2010-12-17 09:00:58

ответ

6

Используйте MAC address:

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

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

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

+0

Я не знаю, поддерживает ли Android иммунитет, но MAC-адреса могут быть обмануты во многих системах. – Squonk 2010-12-17 07:23:45

2

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

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

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

30

Есть три типа идентификатора на телефон андроид.

  1. IMEI
  2. IMSI

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

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

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

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(); 
    } 
} 
21
Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

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

Некоторые из устройств Android имеют проблемы Некоторые устройства возвращают значение null, когда мы пытаемся получить идентификатор устройства. Единственный способ решить эту проблему - создать псевдо-идентификатор, который должен быть сгенерирован самим пользователем. Эта функция будет генерировать уникальную 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; 

} 
1

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

import android.provider.Settings.Secure; 

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

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

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

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

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

  • The IMEI (международный идентификатор мобильного оборудования)
  • Андроида ID
  • Адресная строка WLAN MAC
  • адреса Bluetooth строка

1) IMEI: (International Mobile Идентификация оборудования)

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

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

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

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

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

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

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

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

2) Андроид ID

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

код, чтобы получить Android_ID будет показано ниже,

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

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

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

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

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

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

3) Адресная строка WLAN MAC

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

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

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

Вашего приложение будет требовать разрешений «android.permission.ACCESS_WIFI_STATE», данных в файле манифеста.

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

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

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

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

4) Адресная строка Bluetooth

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

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

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

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

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

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

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

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

Here's the article

0
TextView textAndroidId = (TextView)findViewById(R.id.androidid); 
String AndroidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); 
textAndroidId.setText("My ID is: " + AndroidId); 
1
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(); 
1

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

String deviceId = Secure.getString(this.getContentResolver(), 
       Secure.ANDROID_ID); 
Смежные вопросы