Jak programowo uzyskać IMEI / ESN urządzenia w Androidzie?
343
Aby jednoznacznie zidentyfikować każde urządzenie, chciałbym użyć numeru IMEI (lub numeru ESN dla urządzeń CDMA). Jak uzyskać dostęp do tego programowo?
Biorąc to pod uwagę, uważaj na to. Użytkownicy będą nie tylko zastanawiać się, dlaczego aplikacja uzyskuje dostęp do stosu telefonii, ale migracja danych może być trudna, jeśli użytkownik otrzyma nowe urządzenie.
Aktualizacja: jak wspomniano w komentarzach poniżej, nie jest to bezpieczny sposób uwierzytelniania użytkowników i budzi obawy dotyczące prywatności. Nie jest to zalecane. Zamiast tego spójrz na interfejs API do logowania Google+, jeśli chcesz wdrożyć bezproblemowy system logowania.
Android API kopii zapasowej jest również dostępna, jeśli chcesz tylko lekki sposób, aby utrzymywać wiązkę Struny do kiedy użytkownik resetuje swój telefon (lub kupuje nowe urządzenie).
Jakie byłoby lepsze rozwiązanie, które umożliwiłoby im migrację danych w przyszłości? Adres e-mail Google? Jeśli tak, to jak mogę to wyciągnąć z systemu?
Tom
3
Najbardziej niezawodnym sposobem na to jest utworzenie konta przy pierwszym uruchomieniu aplikacji. Istnieją sposoby na uzyskanie adresu e-mail użytkownika (zobacz dokumenty na AccountManager), ale sprawdzenie, czy złośliwy użytkownik nie podrobił tych informacji, wymaga nieco wiedzy na temat działania interfejsów API Google Data - więcej, niż mogę w tym napisać małe pole komentarza. ;)
Trevor Johns
1
Właściwie to nie masz żadnej gwarancji, że użytkownik również nie podrobił swojego numeru IMEI / MEID. Jeśli bezpieczeństwo budzi jakiekolwiek obawy, naprawdę musisz użyć nazwy użytkownika / hasła lub metody getAuthToken () w AccountManager (i ponownie, musisz zweryfikować ten token na serwerze, który go pierwotnie wydał).
Trevor Johns
2
Adi: kod do uzyskania identyfikatora urządzenia? Nie ma nic więcej niż jedna metoda + pozwolenie, o którym wspomniałem powyżej. To powiedziawszy, powinieneś przyjrzeć się API logowania do Google+, jest to obecnie zalecane podejście do uwierzytelniania użytkowników: developer.android.com/google/play-services/auth.html
Trevor Johns
2
Czy to działa na Androidzie 6? Czy kierujesz reklamy na pakiet SDK 23? Następnie musisz poprosić o READ_PHONE_STATE w czasie wykonywania przed wysłaniem zapytania do IMEI
Flo We
284
Oprócz odpowiedzi Trevora Johnsa możesz użyć tego w następujący sposób:
Czy istnieje sposób, aby emulator zwrócił numer IMEI?
MikeSchem
@MikeSchem, emulator nie ma znaczącego ciągu IMEI.
shizhen
Spróbuj nie używać: <uses-permission android: name = "android.permission.READ_PHONE_STATE" /> to uprawnienie jest bardzo wrażliwe, możesz otrzymać aplikację odrzuconą od zespołu Google Play (nowe reguły bezpieczeństwa dodano pod koniec 2018 roku). Jako poradę lepiej użyj identyfikatora reklamowego.
Duna
@ Taner Czy to będzie działać na urządzeniu Dual SIM? (Musisz zdobyć tylko pierwszy IMEI)
Arnold Brown
Czy korzystanie z READ_PHONE_STATEuprawnień wiąże się z obawami dotyczącymi bezpieczeństwa ?
viper
62
Korzystam z następującego kodu, aby uzyskać numer IMEI, lub alternatywnie korzystam z Secure.ANDROID_ID, gdy urządzenie nie ma możliwości telefonu:
/**
* Returns the unique identifier for the device
*
* @return unique identifier for the device
*/publicString getDeviceIMEI(){String deviceUniqueIdentifier =null;TelephonyManager tm =(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);if(null!= tm){
deviceUniqueIdentifier = tm.getDeviceId();}if(null== deviceUniqueIdentifier ||0== deviceUniqueIdentifier.length()){
deviceUniqueIdentifier =Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);}return deviceUniqueIdentifier;}
Cześć Pinhassi, Czy zdarzyło Ci się, że identyfikator urządzenia zwrócony przez menedżera telefonii był zerowy lub pusty, ale wartość odczytana z Secure.ANDROID_ID nie była pusta? Dziękuję
Budda,
4
O ile pamiętam, dotyczyło to tabletów bez karty SIM (ale nie jestem w 100% pewien).
Asaf Pinhassi
Secure.ANDROID_ID zmienia się, jeśli urządzenie zostanie sformatowane lub ROM zostanie przywrócony do ustawień fabrycznych
Shridutt Kothari
Mój Nexus7 (1stGen) zwraca nullurządzenie telefoniczneId ... Czy ktoś wie, jak uzyskać numer IMEI z tabletu?
Sakiboy,
38
Lub możesz użyć ustawienia ANDROID_ID z Android.Provider.Settings.System (jak opisano tutaj strazerre.com ).
Ma to tę zaletę, że nie wymaga specjalnych uprawnień, ale może się zmienić, jeśli inna aplikacja ma dostęp do zapisu i ją zmieni (co jest pozornie niezwykłe, ale nie niemożliwe).
Uwaga dotycząca implementacji : jeśli identyfikator ma krytyczne znaczenie dla architektury systemu, należy pamiętać, że w praktyce niektóre z bardzo niskiej klasy telefonów i tabletów z Androidem wykorzystały ten sam ANDROID_ID (wartość 9774d56d682e549c była wartością wyświetlaną w naszych logach)
Ta stała jest przestarzała. Zamiast tego musisz użyć android.provider.Settings.Secure.ANDROID_ID;
mcorley,
@mcorley, gdy korzystam z android.provider.Settings.Secure.ANDROID_ID dla tabletu Nexus 7 i Nexusa 4, zwraca tę samą wartość „android_id”
vuhung3990
3
@meowmeo zrobił to samo dla mnie, dopóki nie użyłem kodu, który jest teraz częścią odpowiedzi (ish). String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Matthias
Ale czy nie przywróci to nowego ANDROID_ID po przywróceniu ustawień fabrycznych? Co jeśli potrzebuję trwałego ANDROID_ID, który może przetrwać resety.
to jest rzeczywisty kod, który szukam, aby uzyskać IMEI
Anand Savjani
2
Niestety, z Marshmallow naprzód musisz teraz poprosić o to pozwolenie w czasie wykonywania. To uprawnienie nie jest idealne, ponieważ zakłóca komfort użytkowania i może wzbudzać podejrzenia niektórych użytkowników.
IgorGanapolsky
Spróbuj nie używać: <uses-permission android: name = "android.permission.READ_PHONE_STATE" /> to uprawnienie jest bardzo wrażliwe, możesz otrzymać aplikację odrzuconą od zespołu Google Play (nowe reguły bezpieczeństwa dodano pod koniec 2018 roku). Jako poradę lepiej użyj identyfikatora reklamowego zamiast IMEI
Duna
jakie jest rozwiązanie dla Androida 10?
Amin Pinjari,
23
uzyskać IMEI (międzynarodowy identyfikator urządzenia mobilnego)
Pokazanie alternatywy device_unique_id jest naprawdę pomocne
JoeGalind
20
W przypadku Androida 6.0+ gra się zmieniła, więc sugeruję, abyś z niej skorzystał;
Najlepszym sposobem jest przejście w czasie wykonywania, w przeciwnym razie wystąpią błędy uprawnień.
/**
* A loading screen after AppIntroActivity.
*/publicclassLoadingActivityextendsBaseActivity{privatestaticfinalint MY_PERMISSIONS_REQUEST_READ_PHONE_STATE =0;privateTextView loading_tv2;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);//trigger 'loadIMEI'
loadIMEI();/** Fading Transition Effect */
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);}/**
* Called when the 'loadIMEI' function is triggered.
*/publicvoid loadIMEI(){// Check if the READ_PHONE_STATE permission is already available.if(ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){// READ_PHONE_STATE permission has not been granted.
requestReadPhoneStatePermission();}else{// READ_PHONE_STATE permission is already been granted.
doPermissionGrantedStuffs();}}/**
* Requests the READ_PHONE_STATE permission.
* If the permission has been denied previously, a dialog will prompt the user to grant the
* permission, otherwise it is requested directly.
*/privatevoid requestReadPhoneStatePermission(){if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_PHONE_STATE)){// Provide an additional rationale to the user if the permission was not granted// and the user would benefit from additional context for the use of the permission.// For example if the user has previously denied the permission.newAlertDialog.Builder(LoadingActivity.this).setTitle("Permission Request").setMessage(getString(R.string.permission_read_phone_state_rationale)).setCancelable(false).setPositiveButton(android.R.string.yes,newDialogInterface.OnClickListener(){publicvoid onClick(DialogInterface dialog,int which){//re-requestActivityCompat.requestPermissions(LoadingActivity.this,newString[]{Manifest.permission.READ_PHONE_STATE},
MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);}}).setIcon(R.drawable.onlinlinew_warning_sign).show();}else{// READ_PHONE_STATE permission has not been granted yet. Request it directly.ActivityCompat.requestPermissions(this,newString[]{Manifest.permission.READ_PHONE_STATE},
MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);}}/**
* Callback received when a permissions request has been completed.
*/@Overridepublicvoid onRequestPermissionsResult(int requestCode,@NonNullString[] permissions,@NonNullint[] grantResults){if(requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE){// Received permission result for READ_PHONE_STATE permission.est.");// Check if the only required permission has been grantedif(grantResults.length ==1&& grantResults[0]==PackageManager.PERMISSION_GRANTED){// READ_PHONE_STATE permission has been granted, proceed with displaying IMEI Number//alertAlert(getString(R.string.permision_available_read_phone_state));
doPermissionGrantedStuffs();}else{
alertAlert(getString(R.string.permissions_not_granted_read_phone_state));}}}privatevoid alertAlert(String msg){newAlertDialog.Builder(LoadingActivity.this).setTitle("Permission Request").setMessage(msg).setCancelable(false).setPositiveButton(android.R.string.yes,newDialogInterface.OnClickListener(){publicvoid onClick(DialogInterface dialog,int which){// do somthing here}}).setIcon(R.drawable.onlinlinew_warning_sign).show();}publicvoid doPermissionGrantedStuffs(){//Have an object of TelephonyManagerTelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);//Get IMEI Number of Phone //////////////// for this example i only need the IMEIStringIMEINumber=tm.getDeviceId();/************************************************
* **********************************************
* This is just an icing on the cake
* the following are other children of TELEPHONY_SERVICE
*
//Get Subscriber ID
String subscriberID=tm.getDeviceId();
//Get SIM Serial Number
String SIMSerialNumber=tm.getSimSerialNumber();
//Get Network Country ISO Code
String networkCountryISO=tm.getNetworkCountryIso();
//Get SIM Country ISO Code
String SIMCountryISO=tm.getSimCountryIso();
//Get the device software version
String softwareVersion=tm.getDeviceSoftwareVersion()
//Get the Voice mail number
String voiceMailNumber=tm.getVoiceMailNumber();
//Get the Phone Type CDMA/GSM/NONE
int phoneType=tm.getPhoneType();
switch (phoneType)
{
case (TelephonyManager.PHONE_TYPE_CDMA):
// your code
break;
case (TelephonyManager.PHONE_TYPE_GSM)
// your code
break;
case (TelephonyManager.PHONE_TYPE_NONE):
// your code
break;
}
//Find whether the Phone is in Roaming, returns true if in roaming
boolean isRoaming=tm.isNetworkRoaming();
if(isRoaming)
phoneDetails+="\nIs In Roaming : "+"YES";
else
phoneDetails+="\nIs In Roaming : "+"NO";
//Get the SIM state
int SIMState=tm.getSimState();
switch(SIMState)
{
case TelephonyManager.SIM_STATE_ABSENT :
// your code
break;
case TelephonyManager.SIM_STATE_NETWORK_LOCKED :
// your code
break;
case TelephonyManager.SIM_STATE_PIN_REQUIRED :
// your code
break;
case TelephonyManager.SIM_STATE_PUK_REQUIRED :
// your code
break;
case TelephonyManager.SIM_STATE_READY :
// your code
break;
case TelephonyManager.SIM_STATE_UNKNOWN :
// your code
break;
}
*/// Now read the desired content to a textview.
loading_tv2 =(TextView) findViewById(R.id.loading_tv2);
loading_tv2.setText(IMEINumber);}}
W Androidzie w wersji 6 i nowszych adres MAC WLAN jest nieaktualny, postępuj zgodnie z odpowiedzią Trevor Johns
Aktualizacja:
Do jednoznacznej identyfikacji urządzeń możesz użyć Secure.ANDROID_ID .
Stara odpowiedź:
Wady używania IMEI jako unikalnego identyfikatora urządzenia:
IMEI zależy od gniazda karty SIM w urządzeniu, więc nie można uzyskać numeru IMEI dla urządzeń, które nie używają karty SIM. W urządzeniach z dwiema kartami SIM otrzymujemy 2 różne numery IMEI dla tego samego urządzenia, ponieważ ma 2 gniazda na kartę SIM.
Możesz użyć ciągu adresu MAC WLAN (niezalecane dla Marshmallow i Marshmallow +, ponieważ adres MAC WLAN został przestarzały podczas przesyłania Marshmallow do przodu. Otrzymasz więc fałszywą wartość)
Możemy również uzyskać unikalny identyfikator dla telefonów z systemem Android za pomocą adresu MAC WLAN. Adres MAC jest unikalny dla wszystkich urządzeń i działa na wszystkich rodzajach urządzeń.
Zalety używania adresu MAC WLAN jako identyfikatora urządzenia:
Jest to unikalny identyfikator dla wszystkich typów urządzeń (smartfonów i tabletów).
Pozostaje unikalny, jeśli aplikacja zostanie ponownie zainstalowana
Wady używania adresu MAC WLAN jako identyfikatora urządzenia:
Daj ci fałszywą wartość z pianki i wyżej.
Jeśli urządzenie nie ma sprzętu Wi-Fi, otrzymasz pusty adres MAC, ale ogólnie widać, że większość urządzeń z Androidem ma sprzęt Wi-Fi i na rynku jest niewiele urządzeń bez sprzętu Wi-Fi.
Międzynarodowy identyfikator stacji mobilnej lub w skrócie IMEI to numer identyfikujący telefony komórkowe działające w sieci GSM. Osobiście próbowałem i programowo daje mi to zero, jeśli w telefonie GSM nie ma operatora komórkowego. smartmobilephonesolutions.com/content/…
Jamil
3
Masz rację, nie czytałem dokładnie. IMEI jest powiązany z transceiverem karty SIM, a nie z kartą SIM. Mój błąd!
Merlevede
2
Adres MAC WLAN został uznany za przestarzały przy przesyłaniu dalej Marshmallow. Otrzymasz fałszywą wartość!
IgorGanapolsky
1
Android 6 nie zwraca poprawnego adresu MAC Wi-Fi ze swoim kodem. Zauważ to.
zszen
15
Podobnie jak w API 26 getDeviceId()jest amortyzowany, więc możesz użyć następującego kodu, aby obsłużyć API 26 i wcześniejsze wersje
Niestety, w systemie Android 10 ze względów bezpieczeństwa aplikacje innych firm nie mogą pobierać identyfikatorów sprzętowych, takich jak IMEI, aby uzyskać więcej informacji na temat zmian prywatności w systemie Android 10 na stronie developer.android.com/about/versions/10/privacy
Muhammad Hamza Shahid
Działa na Androidzie Oreo.
Satish Shetty
10
Metoda getDeviceId () z TelephonyManager zwraca unikalny identyfikator urządzenia, na przykład IMEI dla GSM i MEID lub ESN dla telefonów CDMA. Zwraca null, jeśli identyfikator urządzenia nie jest dostępny.
Kod Java
package com.AndroidTelephonyManager;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.telephony.TelephonyManager;import android.widget.TextView;publicclassAndroidTelephonyManagerextendsActivity{/** Called when the activity is first created. */@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);TextView textDeviceID =(TextView)findViewById(R.id.deviceid);//retrieve a reference to an instance of TelephonyManagerTelephonyManager telephonyManager =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(telephonyManager));}String getDeviceID(TelephonyManager phonyManager){String id = phonyManager.getDeviceId();if(id ==null){
id ="not available";}int phoneType = phonyManager.getPhoneType();switch(phoneType){caseTelephonyManager.PHONE_TYPE_NONE:return"NONE: "+ id;caseTelephonyManager.PHONE_TYPE_GSM:return"GSM: IMEI="+ id;caseTelephonyManager.PHONE_TYPE_CDMA:return"CDMA: MEID/ESN="+ id;/*
* for API Level 11 or above
* case TelephonyManager.PHONE_TYPE_SIP:
* return "SIP";
*/default:return"UNKNOWN: ID="+ id;}}}
Przykład: IMEI dla GSM i MEID lub ESN dla telefonów CDMA .
/**
* Gets the device unique id called IMEI. Sometimes, this returns 00000000000000000 for the
* rooted devices.
**/publicstaticString getDeviceImei(Context ctx){TelephonyManager telephonyManager =(TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);return telephonyManager.getDeviceId();}
Zwraca null, jeśli identyfikator urządzenia nie jest dostępny .
Spróbuj tego (zawsze musisz uzyskać pierwszy IMEI)
TelephonyManager mTelephony =(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);if(ActivityCompat.checkSelfPermission(LoginActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){return;}if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M){if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.O){if(mTelephony.getPhoneCount()==2){
IME = mTelephony.getImei(0);}else{
IME = mTelephony.getImei();}}else{if(mTelephony.getPhoneCount()==2){
IME = mTelephony.getDeviceId(0);}else{
IME = mTelephony.getDeviceId();}}}else{
IME = mTelephony.getDeviceId();}
Kod Kotlin do uzyskiwania DeviceId (IMEI) z pozwoleniem na obsługę i sprawdzaniem porównywalności dla wszystkich wersji Androida:
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE)asTelephonyManagerif(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)==PackageManager.PERMISSION_GRANTED){// Permission is granted
val imei :String?=if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.O) telephonyManager.imei
// older OS versionselse telephonyManager.deviceId
imei?.let{Log.i("Log","DeviceId=$it")}}else{// Permission is not granted}
Dodaj także to uprawnienie do pliku AndroidManifest.xml:
Aby uzyskać IMEI (międzynarodowy identyfikator urządzenia mobilnego) i jeśli jest on powyżej poziomu API 26, wówczas otrzymujemy telephonyManager.getImei()wartość null, dlatego używamy ANDROID_ID jako unikalnego identyfikatora.
publicstaticString getIMEINumber(@NonNullfinalContext context)throwsSecurityException,NullPointerException{TelephonyManager tm =(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String imei;if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.O){assert tm !=null;
imei = tm.getImei();//this change is for Android 10 as per security concern it will not provide the imei number.if(imei ==null){
imei =Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);}}else{assert tm !=null;if(tm.getDeviceId()!=null&&!tm.getDeviceId().equals("000000000000000")){
imei = tm.getDeviceId();}else{
imei =Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);}}return imei;}
Odpowiedzi:
Chcesz zadzwonić
android.telephony.TelephonyManager.getDeviceId()
.Zwróci to ciąg znaków, który jednoznacznie identyfikuje urządzenie (IMEI na GSM, MEID dla CDMA).
Będziesz potrzebować następującego pozwolenia w swoim
AndroidManifest.xml
:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
aby to zrobić.
Biorąc to pod uwagę, uważaj na to. Użytkownicy będą nie tylko zastanawiać się, dlaczego aplikacja uzyskuje dostęp do stosu telefonii, ale migracja danych może być trudna, jeśli użytkownik otrzyma nowe urządzenie.
Aktualizacja: jak wspomniano w komentarzach poniżej, nie jest to bezpieczny sposób uwierzytelniania użytkowników i budzi obawy dotyczące prywatności. Nie jest to zalecane. Zamiast tego spójrz na interfejs API do logowania Google+, jeśli chcesz wdrożyć bezproblemowy system logowania.
Android API kopii zapasowej jest również dostępna, jeśli chcesz tylko lekki sposób, aby utrzymywać wiązkę Struny do kiedy użytkownik resetuje swój telefon (lub kupuje nowe urządzenie).
źródło
Oprócz odpowiedzi Trevora Johnsa możesz użyć tego w następujący sposób:
I powinieneś dodać następujące uprawnienia do pliku Manifest.xml:
W emulatorze prawdopodobnie uzyskasz wartość „00000 ...”. getDeviceId () zwraca NULL, jeśli identyfikator urządzenia nie jest dostępny.
źródło
READ_PHONE_STATE
uprawnień wiąże się z obawami dotyczącymi bezpieczeństwa ?Korzystam z następującego kodu, aby uzyskać numer IMEI, lub alternatywnie korzystam z Secure.ANDROID_ID, gdy urządzenie nie ma możliwości telefonu:
źródło
null
urządzenie telefoniczneId ... Czy ktoś wie, jak uzyskać numer IMEI z tabletu?Lub możesz użyć ustawienia ANDROID_ID z Android.Provider.Settings.System (jak opisano tutaj strazerre.com ).
Ma to tę zaletę, że nie wymaga specjalnych uprawnień, ale może się zmienić, jeśli inna aplikacja ma dostęp do zapisu i ją zmieni (co jest pozornie niezwykłe, ale nie niemożliwe).
Dla odniesienia tutaj jest kod z bloga:
Uwaga dotycząca implementacji : jeśli identyfikator ma krytyczne znaczenie dla architektury systemu, należy pamiętać, że w praktyce niektóre z bardzo niskiej klasy telefonów i tabletów z Androidem wykorzystały ten sam ANDROID_ID (wartość 9774d56d682e549c była wartością wyświetlaną w naszych logach)
źródło
String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Od: http://mytechead.wordpress.com/2011/08/28/how-to-get-ime-number-of-android-device/ :
Poniższy kod pomaga w uzyskaniu numeru IMEI urządzeń z systemem Android:
Uprawnienia wymagane w Manifeście Androida:
UWAGA: W przypadku tabletów lub urządzeń, które nie mogą działać jako telefon komórkowy, numer IMEI będzie zerowy.
źródło
uzyskać IMEI (międzynarodowy identyfikator urządzenia mobilnego)
aby uzyskać unikalny identyfikator urządzenia
źródło
W przypadku Androida 6.0+ gra się zmieniła, więc sugeruję, abyś z niej skorzystał;
Najlepszym sposobem jest przejście w czasie wykonywania, w przeciwnym razie wystąpią błędy uprawnień.
Mam nadzieję, że to pomoże tobie lub komuś.
źródło
Nowa aktualizacja:
W Androidzie w wersji 6 i nowszych adres MAC WLAN jest nieaktualny, postępuj zgodnie z odpowiedzią Trevor Johns
Aktualizacja:
Do jednoznacznej identyfikacji urządzeń możesz użyć Secure.ANDROID_ID .
Stara odpowiedź:
Wady używania IMEI jako unikalnego identyfikatora urządzenia:
Możesz użyć ciągu adresu MAC WLAN (niezalecane dla Marshmallow i Marshmallow +, ponieważ adres MAC WLAN został przestarzały podczas przesyłania Marshmallow do przodu. Otrzymasz więc fałszywą wartość)
Możemy również uzyskać unikalny identyfikator dla telefonów z systemem Android za pomocą adresu MAC WLAN. Adres MAC jest unikalny dla wszystkich urządzeń i działa na wszystkich rodzajach urządzeń.
Zalety używania adresu MAC WLAN jako identyfikatora urządzenia:
Jest to unikalny identyfikator dla wszystkich typów urządzeń (smartfonów i tabletów).
Pozostaje unikalny, jeśli aplikacja zostanie ponownie zainstalowana
Wady używania adresu MAC WLAN jako identyfikatora urządzenia:
Daj ci fałszywą wartość z pianki i wyżej.
Jeśli urządzenie nie ma sprzętu Wi-Fi, otrzymasz pusty adres MAC, ale ogólnie widać, że większość urządzeń z Androidem ma sprzęt Wi-Fi i na rynku jest niewiele urządzeń bez sprzętu Wi-Fi.
ŹRÓDŁO: technetexperts.com
źródło
Podobnie jak w API 26
getDeviceId()
jest amortyzowany, więc możesz użyć następującego kodu, aby obsłużyć API 26 i wcześniejsze wersjeNie zapomnij dodać wniosków o pozwolenie na
READ_PHONE_STATE
używanie powyższego kodu.AKTUALIZACJA: W systemie Android 10 aplikacja użytkownika może uzyskiwać niepowtarzalne identyfikatory sprzętowe, takie jak IMEI.
źródło
Metoda getDeviceId () z TelephonyManager zwraca unikalny identyfikator urządzenia, na przykład IMEI dla GSM i MEID lub ESN dla telefonów CDMA. Zwraca null, jeśli identyfikator urządzenia nie jest dostępny.
Kod Java
XML
Wymagane zezwolenie READ_PHONE_STATE w pliku manifestu.
źródło
Możesz użyć tej funkcji TelephonyManager TELEPHONY_SERVICE, aby uzyskać unikalny identyfikator urządzenia , wymaga pozwolenia: READ_PHONE_STATE
Przykład: IMEI dla GSM i MEID lub ESN dla telefonów CDMA .
Zwraca null, jeśli identyfikator urządzenia nie jest dostępny .
źródło
Metoda
getDeviceId()
jest przestarzała. Jest na to nowa metodagetImei(int)
Sprawdź tutaj
źródło
Spróbuj tego (zawsze musisz uzyskać pierwszy IMEI)
źródło
Użyj poniższego kodu, aby uzyskać numer IMEI:
źródło
dla interfejsu API poziomu 11 lub wyższego:
źródło
Kod Kotlin do uzyskiwania DeviceId (IMEI) z pozwoleniem na obsługę i sprawdzaniem porównywalności dla wszystkich wersji Androida:
Dodaj także to uprawnienie do pliku AndroidManifest.xml:
źródło
Będziesz potrzebować następującego uprawnienia w pliku AndroidManifest.xml:
Aby uzyskać IMEI (międzynarodowy identyfikator urządzenia mobilnego) i jeśli jest on powyżej poziomu API 26, wówczas otrzymujemy
telephonyManager.getImei()
wartość null, dlatego używamy ANDROID_ID jako unikalnego identyfikatora.źródło
Dla tych, którzy szukają wersji Kotlin, możesz użyć czegoś takiego;
UWAGA: Musisz owinąć
telephonyService()
powyższe sprawdzenie uprawnień za pomocą checkSelfPermission lub jakiejkolwiek metody, której używasz.Dodaj także to uprawnienie do pliku manifestu;
źródło
użyj poniższego kodu:
I wywołaj metodę onRequestPermissionsResult następujący kod:
Dodaj następujące uprawnienie w pliku AndroidManifest.xml:
źródło
Dla Androida 10 Poniższy kod działa dla mnie.
źródło