2010-09-27 9 views
14

Chcę uzyskać identyfikator urządzenia, który będzie niepowtarzalny dla każdego urządzenia z Androidem. Obecnie pracuję nad urządzeniem typu Tablet. Chcesz uzyskać unikalny identyfikator urządzenia i zapisać odpowiednie wartości ...Czy TelephonyManger.getDeviceId() zwróci identyfikator urządzenia dla tabletów takich jak Galaxy Tab ...?

Chcę wiedzieć, czy urządzenia typu Tablet zwrócą wartość, jeśli używam TelephonyManager.getDeviceId() ... ??? Czy jest jakiś inny wartość, która jest unikalna dla każdego urządzenia?

+1

Dupe: http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id – fredley

Odpowiedz

8

To jest a nie duplikat pytania. Jak się okazało, Google CTS wymaga, aby getPhoneType w TelephonyManager było zerowe, a getDeviceId w menedżerze telefonii musi mieć wartość null dla urządzeń innych niż telefony.

Tak, aby uzyskać IMEI, spróbuj użyć:

String imei = SystemProperties.get("ro.gsm.imei") 

Niestety SystemProperties jest niepubliczną klasa w Android OS, co oznacza, że ​​nie jest ono dostępne do zwykłych zastosowań. Spróbuj poszukać na tym stanowisku za pomocą dostępu do niego: Where is android.os.SystemProperties

49

TelephonyManger.getDeviceId() zwraca unikalny identyfikator urządzenia, na przykład numer IMEI GSM i MEID lub ESN dla telefonów CDMA.

final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);    
String myAndroidDeviceId = mTelephony.getDeviceId(); 

ale polecam użyć:

Settings.Secure.ANDROID_ID, która zwraca identyfikator Androida jako unikalny 64-bitowy ciąg szesnastkowy.

String myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 

Czasami TelephonyManger.getDeviceId() zwróci null, tak aby zapewnić unikalny identyfikator będzie użyć tej metody:

public String getUniqueID(){  
    String myAndroidDeviceId = ""; 
    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    if (mTelephony.getDeviceId() != null){ 
     myAndroidDeviceId = mTelephony.getDeviceId(); 
    }else{ 
     myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
    } 
    return myAndroidDeviceId; 
} 
+4

To rozwiązanie ma problem: gdy użytkownik przełącza się w tryb samolotowy, informacja telefoniczna znika, a metoda zwróci wartość "Secure.ANDROID_ID". Tak więc metoda 'getUniqueID()' może zwracać różne wartości dla różnych stanów tego samego urządzenia. –

+0

@TedHopp, sprawdzona na kilku urządzeniach - w trybie samolotowym getUniqueID() zwraca tę samą wartość, co –

+0

, dlaczego ANDROID_ID zwraca 16-cyfrowy identyfikator dla mnie, zamiast 64-cyfrowego hexa @ Elenasys – user1801879

2

Ponieważ Android 8 wszystko się zmieniło. Powinieneś użyć Build.getSerial(), aby uzyskać numer seryjny urządzenia i dodać pozwolenie READ_PHONE_STATE.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
    serial = Build.getSerial(); // Requires permission READ_PHONE_STATE 
} else { 
    serial = Build.SERIAL; // Will return 'unknown' for device >= Build.VERSION_CODES.O 
} 

i uzyskać IMEI lub MEID ten sposób:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
    String imei = tm.getImei(); // Requires permission READ_PHONE_STATE 
    serial = imei == null ? tm.getMeid() : imei; // Requires permission READ_PHONE_STATE 
} else { 
    serial = tm.getDeviceId(); // Requires permission READ_PHONE_STATE 
} 
Powiązane problemy