Czy urządzenia z Androidem mają unikalny identyfikator, a jeśli tak, to jaki jest prosty sposób na dostęp do niego za pomocą Java?
android
uniqueidentifier
Tyler
źródło
źródło
ANDROID_ID
, przeczytaj tę odpowiedź i ten błąd .Odpowiedzi:
Settings.Secure#ANDROID_ID
zwraca identyfikator Androida jako unikalny dla każdego 64-bitowego ciągu szesnastkowego użytkownika.źródło
AKTUALIZACJA : Od najnowszych wersji Androida wiele problemów
ANDROID_ID
zostało rozwiązanych i uważam, że to podejście nie jest już konieczne. Proszę spojrzeć na odpowiedź Anthony'ego .Pełne ujawnienie: moja aplikacja początkowo stosowała poniższe podejście, ale już nie stosuje tego podejścia, a teraz korzystamy z podejścia opisanego we wpisie na blogu programisty Androida, do którego prowadzi link odpowiedzi emmby (a mianowicie, generowanie i zapisywanie a
UUID#randomUUID()
).Istnieje wiele odpowiedzi na to pytanie, z których większość będzie działać tylko „przez pewien czas”, i niestety to nie wystarczy.
Na podstawie moich testów urządzeń (wszystkich telefonów, z których przynajmniej jeden nie jest aktywowany):
TelephonyManager.getDeviceId()
TelephonyManager.getSimSerialNumber()
getSimSerialNumber()
(zgodnie z oczekiwaniami)ANDROID_ID
ANDROID_ID
iTelephonyManager.getDeviceId()
- o ile konto Google zostało dodane podczas instalacji.Więc jeśli chcesz czegoś wyjątkowego dla samego urządzenia,
TM.getDeviceId()
powinno wystarczyć. Oczywiście niektórzy użytkownicy są bardziej paranoiczni niż inni, więc może być użyteczne zaszyfrowanie 1 lub więcej takich identyfikatorów, tak aby ciąg znaków był praktycznie unikalny dla urządzenia, ale nie identyfikował wyraźnie rzeczywistego urządzenia użytkownika. Na przykład przy użyciuString.hashCode()
w połączeniu z UUID:może spowodować coś takiego jak:
00000000-54b3-e7c7-0000-000046bffd97
Działa dla mnie wystarczająco dobrze.
Jak Richard wspomina poniżej, nie zapominaj, że potrzebujesz pozwolenia na odczytanie
TelephonyManager
właściwości, więc dodaj to do swojego manifestu:importuj biblioteki lib
źródło
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
do pliku manifestu. W przypadku przechowywania w bazie danych zwracany ciąg ma 36 znaków.Ostatnia aktualizacja: 6/2/15
Po przeczytaniu każdego wpisu przepełnienia stosu dotyczącego tworzenia unikalnego identyfikatora, blogu programisty Google i dokumentacji Androida, wydaje mi się, że „Pseudo-identyfikator” jest najlepszą możliwą opcją.
Główny problem: sprzęt kontra oprogramowanie
Sprzęt komputerowy
Oprogramowanie
Ogólny podział na Androida
- Gwarancja wyjątkowości (w tym zrootowanych urządzeń) dla API> = 9/10 (99,5% urządzeń z Androidem)
- Bez dodatkowych uprawnień
Kod Psuedo:
Dzięki @stansult za opublikowanie wszystkich naszych opcji (w tym pytaniu Przepełnienie stosu).
Lista opcji - powody, dla których / dlaczego ich nie używać:
Adres e-mail użytkownika - oprogramowanie
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
lub<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
( Jak uzyskać główny adres e-mail urządzenia z systemem Android )Numer telefonu użytkownika - oprogramowanie
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
IMEI - sprzęt (tylko telefony, potrzebne
android.permission.READ_PHONE_STATE
)<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android ID - sprzęt (może być zerowy, może ulec zmianie po przywróceniu ustawień fabrycznych, może być zmieniony na zrootowanym urządzeniu)
Adres MAC sieci WLAN - sprzęt (wymaga
android.permission.ACCESS_WIFI_STATE
)<uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
Adres MAC Bluetooth - sprzęt (urządzenia z Bluetooth, wymagają
android.permission.BLUETOOTH
)<uses-permission android:name="android.permission.BLUETOOTH "/>
Pseudo-unikalny identyfikator - oprogramowanie (dla wszystkich urządzeń z Androidem)
Wiem, że nie ma żadnego „idealnego” sposobu uzyskania unikalnego identyfikatora bez użycia uprawnień; Czasami jednak naprawdę musimy tylko śledzić instalację urządzenia. Jeśli chodzi o tworzenie unikalnego identyfikatora, możemy stworzyć „pseudo unikalny identyfikator” oparty wyłącznie na informacjach, które daje nam interfejs API Androida, bez korzystania z dodatkowych uprawnień. W ten sposób możemy okazywać szacunek użytkownikom i starać się oferować dobre wrażenia.
Dzięki pseudo-unikalnemu identyfikatorowi tak naprawdę napotykasz tylko na fakt, że mogą istnieć duplikaty na podstawie faktu, że istnieją podobne urządzenia. Możesz dostosować połączoną metodę, aby była bardziej unikalna; Jednak niektórzy programiści muszą śledzić instalacje urządzeń, a to zrobi sztuczkę lub wydajność w oparciu o podobne urządzenia.
API> = 9:
Jeśli ich urządzeniem z Androidem jest API 9 lub nowszy, gwarantuje to, że będzie unikalny ze względu na pole „Build.SERIAL”.
PAMIĘTAJ , że technicznie brakuje Ci tylko około 0,5% użytkowników, którzy mają API <9 . Możesz więc skupić się na reszcie: to 99,5% użytkowników!
API <9:
Jeśli urządzenie z Androidem użytkownika jest niższe niż API 9; mam nadzieję, że nie przywrócono ustawień fabrycznych, a ich „Secure.ANDROID_ID” zostanie zachowany lub nie będzie „zerowy”. (patrz http://developer.android.com/about/dashboards/index.html )
Jeśli wszystko inne zawiedzie:
Jeśli wszystko inne zawiedzie, jeśli użytkownik ma niższą niż API 9 (niższą niż Gingerbread), zresetował swoje urządzenie lub „Secure.ANDROID_ID” zwraca „null”, wówczas zwrócony identyfikator będzie wyłącznie oparty na informacjach o urządzeniu z Androidem. To tutaj mogą zdarzyć się kolizje.
Zmiany:
Proszę spojrzeć na poniższą metodę:
Nowość (dla aplikacji z reklamami I usługami Google Play):
Z konsoli programisty Google Play:
Realizacja :
Pozwolenie:
Kod:
Źródło / Dokumenty:
http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html
Ważny:
Ostrzeżenie: użytkownicy mogą zresetować:
http://en.kioskea.net/faq/34732-android-reset-your-advertising-id
Próbowałem odwoływać się do każdego linku, z którego wziąłem informacje. Jeśli brakuje i trzeba je uwzględnić, prosimy o komentarz!
Identyfikator wystąpienia Google Player Services
https://developers.google.com/instance-id/
źródło
Build
klasa nie zmieni się po aktualizacji systemu operacyjnego? Zwłaszcza jeśli interfejs API został zaktualizowany? Jeśli tak, w jaki sposób gwarantujesz, że jest to wyjątkowe? (Mówiąc o metodzie, którą napisałeś)Jak wspomina Dave Webb, blog programisty Androida zawiera artykuł na ten temat. Preferowanym przez nich rozwiązaniem jest śledzenie instalacji aplikacji, a nie urządzeń, i będzie to działać dobrze w większości przypadków użycia. Wpis na blogu zawiera kod niezbędny do tego, aby działał, i polecam go sprawdzić.
Jednak blog nadal omawia rozwiązania, jeśli potrzebujesz identyfikatora urządzenia zamiast identyfikatora instalacji aplikacji. Rozmawiałem z kimś z Google, aby uzyskać dodatkowe wyjaśnienia dotyczące kilku elementów na wypadek, gdybyś musiał to zrobić. Oto, co odkryłem na temat identyfikatorów urządzeń, o których NIE wspomniano w wyżej wspomnianym wpisie na blogu:
Opierając się na zaleceniach Google, zaimplementowałem klasę, która wygeneruje unikalny UUID dla każdego urządzenia, używając ANDROID_ID w razie potrzeby jako seed, w razie potrzeby odwołując się do TelephonyManager.getDeviceId (), a jeśli to się nie powiedzie, uciekając się do losowo generowanego unikalnego UUID jest to powtarzane po ponownym uruchomieniu aplikacji (ale nie ponownej instalacji aplikacji).
Należy pamiętać, że w przypadku urządzeń, które muszą mieć awarię identyfikatora urządzenia, unikatowy identyfikator BĘDZIE występował podczas resetowania do ustawień fabrycznych. Jest to coś, o czym należy pamiętać. Jeśli musisz upewnić się, że przywrócenie ustawień fabrycznych spowoduje zresetowanie unikalnego identyfikatora, możesz rozważyć powrót bezpośrednio do losowego identyfikatora UUID zamiast identyfikatora urządzenia.
Ponownie ten kod dotyczy identyfikatora urządzenia, a nie identyfikatora instalacji aplikacji. W większości sytuacji prawdopodobnie szukasz identyfikatora instalacji aplikacji. Ale jeśli potrzebujesz identyfikatora urządzenia, prawdopodobnie poniższy kod będzie dla Ciebie odpowiedni.
źródło
Oto kod, którego Reto Meier użył w tegorocznej prezentacji Google I / O, aby uzyskać unikalny identyfikator dla użytkownika:
Jeśli para to z kopii zapasowej strategii wysyłania preferencje w chmurze (także opisane w Reto w rozmowie , trzeba mieć identyfikator, który więzi z użytkownikiem i kije wokół po urządzenie zostało wymazane, a nawet wymienić. Mam zamiar to wykorzystać w analityce w przyszłości (innymi słowy, jeszcze tego nie zrobiłem :).
źródło
Możesz również wziąć pod uwagę adres MAC karty Wi-Fi. Pobrano w ten sposób:
Wymaga zgody
android.permission.ACCESS_WIFI_STATE
w manifeście.Zgłoszone jako dostępne, nawet gdy Wi-Fi nie jest podłączone. Jeśli Joe z powyższej odpowiedzi wypróbuje ten na wielu swoich urządzeniach, byłoby miło.
Na niektórych urządzeniach nie jest dostępny, gdy Wi-Fi jest wyłączone.
UWAGA: Z systemu Android 6.x zwraca spójny fałszywy adres mac:
02:00:00:00:00:00
źródło
android.permission.ACCESS_WIFI_STATE
02:00:00:00:00:00
Jest raczej przydatna informacji tutaj .
Obejmuje pięć różnych typów identyfikatorów:
android.permission.READ_PHONE_STATE
)android.permission.ACCESS_WIFI_STATE
)android.permission.BLUETOOTH
)źródło
Oficjalny blog programistów Androida zawiera teraz pełny artykuł na ten temat - Identyfikowanie instalacji aplikacji .
źródło
W Google I / O Reto Meier opublikował solidną odpowiedź na pytanie, jak podejść do tego, co powinno zaspokoić większość programistów potrzebujących śledzić użytkowników w różnych instalacjach. Anthony Nolan wskazuje kierunek w swojej odpowiedzi, ale pomyślałem, że wypiszę pełne podejście, aby inni mogli łatwo zobaczyć, jak to zrobić (zajęło mi trochę czasu, aby zrozumieć szczegóły).
Takie podejście da ci anonimowy, bezpieczny identyfikator użytkownika, który będzie trwały dla użytkownika na różnych urządzeniach (w oparciu o podstawowe konto Google) i we wszystkich instalacjach. Podstawowym podejściem jest wygenerowanie losowego identyfikatora użytkownika i zapisanie go we wspólnych preferencjach aplikacji. Następnie używasz agenta kopii zapasowej Google do przechowywania wspólnych preferencji powiązanych z kontem Google w chmurze.
Przejdźmy przez pełne podejście. Najpierw musimy utworzyć kopię zapasową naszych wspólnych preferencji za pomocą usługi Android Backup Service. Zacznij od zarejestrowania aplikacji za pośrednictwem
http://developer.android.com/google/backup/signup.html
.Google da ci klucz usługi kopii zapasowej, który musisz dodać do manifestu. Musisz także powiedzieć aplikacji, aby korzystała z BackupAgent w następujący sposób:
Następnie musisz utworzyć agenta kopii zapasowej i powiedzieć mu, aby używał agenta pomocniczego do wspólnych preferencji:
Aby zakończyć tworzenie kopii zapasowej, musisz utworzyć instancję BackupManager w głównym działaniu:
Na koniec utwórz identyfikator użytkownika, jeśli jeszcze nie istnieje, i zapisz go w SharedPreferences:
Ten identyfikator_użytkownika będzie teraz trwały w różnych instalacjach, nawet jeśli użytkownik przeniesie urządzenie.
Więcej informacji na temat tego podejścia można znaleźć w wykładzie Reto .
Aby uzyskać szczegółowe informacje na temat wdrażania agenta kopii zapasowej, zobacz Kopia zapasowa danych . Szczególnie polecam sekcję na dole dotyczącą testowania, ponieważ tworzenie kopii zapasowej nie następuje natychmiast, więc aby przetestować, musisz wymusić wykonanie kopii zapasowej.
źródło
Myślę, że to z pewnością ognisty sposób na zbudowanie szkieletu dla unikalnego ID ... sprawdź to.
Pseudo-unikalny identyfikator, który działa na wszystkich urządzeniach z Androidem Niektóre urządzenia nie mają telefonu (np. Tablety) lub z jakiegoś powodu nie chcesz dołączać uprawnienia READ_PHONE_STATE. Nadal możesz odczytać szczegóły, takie jak wersja ROM, nazwa producenta, typ procesora i inne szczegóły sprzętowe, które będą odpowiednie, jeśli chcesz użyć identyfikatora do sprawdzania klucza szeregowego lub do innych ogólnych celów. Obliczony w ten sposób identyfikator nie będzie unikalny: można znaleźć dwa urządzenia o tym samym identyfikatorze (oparte na tym samym sprzęcie i obrazie ROM), ale zmiany w rzeczywistych aplikacjach są nieistotne. W tym celu możesz użyć klasy Build:
Większość członków Kompilacji to łańcuchy, a my tutaj zajmujemy ich długość i przekształcamy je za pomocą modulo w cyfrę. Mamy 13 takich cyfr i dodajemy dwie kolejne z przodu (35), aby mieć taki sam identyfikator rozmiaru jak IMEI (15 cyfr). Są tutaj inne możliwości, spójrz tylko na te struny. Zwraca coś takiego
355715565309247
. Nie jest wymagane specjalne pozwolenie, dzięki czemu takie podejście jest bardzo wygodne.(Dodatkowe informacje: technika podana powyżej została skopiowana z artykułu o Pocket Magic .)
źródło
Poniższy kod zwraca numer seryjny urządzenia przy użyciu ukrytego interfejsu API Androida. Ale ten kod nie działa na Samsung Galaxy Tab, ponieważ „ro.serialno” nie jest ustawione na tym urządzeniu.
źródło
ro.serialno
jest on używany do generowaniaSettings.Secure.ANDROID_ID
. Są to w zasadzie różne reprezentacje o tej samej wartości.ANDROID_ID
Z tego wynika tylko nowa wartość dla .android.os.Build.SERIAL
android.os.Build.SERIAL
będzie przestarzałe w Androidzie O, patrz android-developers.googleblog.com/2017/04/…To proste pytanie, bez prostej odpowiedzi.
Co więcej, wszystkie istniejące odpowiedzi tutaj są nieaktualne lub niewiarygodne.
Więc jeśli szukasz rozwiązania w 2020 roku .
Oto kilka rzeczy, o których należy pamiętać:
Wszystkie identyfikatory sprzętowe (SSAID, IMEI, MAC itp.) Są niewiarygodne w przypadku urządzeń innych niż Google (wszystko oprócz pikseli i nexusów), które stanowią ponad 50% aktywnych urządzeń na całym świecie. Dlatego oficjalne najlepsze praktyki dotyczące identyfikatorów Androida wyraźnie stwierdzają:
To sprawia, że większość powyższych odpowiedzi jest nieważna. Również z powodu różnych aktualizacji zabezpieczeń Androida niektóre z nich wymagają nowszych i bardziej rygorystycznych uprawnień do wykonywania, których użytkownik może po prostu odmówić.
Jako przykład,
CVE-2018-9489
który wpływa na wszystkie wyżej wymienione techniki oparte na WIFI.To sprawia, że te identyfikatory są nie tylko zawodne, ale również niedostępne w wielu przypadkach.
Mówiąc prościej: nie używaj tych technik .
Wiele innych odpowiedzi tutaj sugeruje użycie
AdvertisingIdClient
, który jest również niezgodny, ponieważ z założenia należy go używać tylko do profilowania reklam. Jest to również określone w oficjalnym odnośnikuIdentyfikacja urządzenia jest nie tylko niewiarygodna, ale należy również przestrzegać zasad prywatności użytkownika dotyczących zasad śledzenia reklam , które wyraźnie stwierdzają, że użytkownik może je zresetować lub zablokować w dowolnym momencie.
Więc też go nie używaj .
Ponieważ nie można mieć żądanego statycznego, unikalnego globalnie i niezawodnego identyfikatora urządzenia. Oficjalne referencje Androida sugerują:
Jest unikalny w przypadku instalacji aplikacji na urządzeniu, więc gdy użytkownik odinstaluje aplikację - jest usuwana, więc nie jest w 100% niezawodna, ale jest następną najlepszą rzeczą.
Aby użyć,
FirebaseInstanceId
dodaj najnowszą zależność Firebase -Messaging do swojej ocenyI użyj poniższego kodu w wątku w tle:
Jeśli musisz zapisać identyfikator urządzenia na zdalnym serwerze, nie przechowuj go takim, jaki jest (zwykły tekst), ale skrót z solą .
Dzisiaj jest to nie tylko najlepsza praktyka, ale musisz to zrobić zgodnie z prawem zgodnie z RODO - identyfikatory i podobne regulacje.
źródło
Korzystając z poniższego kodu, możesz uzyskać unikatowy identyfikator urządzenia z systemem Android jako ciąg.
źródło
Seryjny pole dodano do
Build
klasy poziomu API 9 (Mobile 2.3 - pierniki). Dokumentacja mówi, że reprezentuje numer seryjny sprzętu. Dlatego powinien być unikalny, jeśli istnieje na urządzeniu.Nie wiem jednak, czy jest on faktycznie obsługiwany (= nie zerowy) przez wszystkie urządzenia z poziomem API> = 9.
źródło
Dodam jeszcze jedną rzecz - mam jedną z tych wyjątkowych sytuacji.
Za pomocą:
Okazuje się, że chociaż mój tablet Viewsonic G zgłasza identyfikator urządzenia, który nie ma wartości NULL, każdy tablet G ma ten sam numer.
Sprawia, że gra w „Pocket Empires” staje się interesująca, co zapewnia natychmiastowy dostęp do czyjegoś konta na podstawie „unikalnego” DeviceID.
Moje urządzenie nie ma radia komórkowego.
źródło
9774d56d682e549c
?Szczegółowe instrukcje na temat uzyskiwania unikalnego identyfikatora dla każdego urządzenia z Androidem, z którego zainstalowana jest aplikacja, można znaleźć na oficjalnym blogu programistów Androida, w którym opisano instalacje aplikacji .
Wydaje się, że najlepszym sposobem jest wygenerowanie go samodzielnie podczas instalacji, a następnie przeczytanie go po ponownym uruchomieniu aplikacji.
Osobiście uważam to za dopuszczalne, ale nie idealne. Żaden identyfikator podany przez Androida nie działa we wszystkich przypadkach, ponieważ większość zależy od stanu radia telefonu (Wi-Fi wł. / Wył., Wł. / Wył. Komórkowy, wł. / Wył. Bluetooth). Inne, podobnie jak
Settings.Secure.ANDROID_ID
muszą być wdrożone przez producenta i nie ma gwarancji, że będą unikalne.Poniżej znajduje się przykład zapisu danych do pliku instalacyjnego , który byłby przechowywany wraz z wszelkimi innymi danymi zapisywanymi lokalnie przez aplikację.
źródło
Dodaj poniższy kod w pliku klasy:
Dodaj w AndroidManifest.xml:
źródło
Unikalny identyfikator urządzenia z systemem operacyjnym Android jako Ciąg, przy użyciu
TelephonyManager
iANDROID_ID
, jest uzyskiwany przez:Ale zdecydowanie zalecam metodę sugerowaną przez Google, patrz Identyfikacja instalacji aplikacji .
źródło
Istnieje wiele różnych podejść do obejścia tych
ANDROID_ID
problemów (mogą byćnull
czasami lub urządzenia określonego modelu zawsze zwracają ten sam identyfikator) z zaletami i wadami:Sam wolę używać istniejącej implementacji OpenUDID (patrz https://github.com/ylechelle/OpenUDID ) dla Androida (patrz https://github.com/vieux/OpenUDID ). Jest łatwa do zintegrowania i wykorzystuje
ANDROID_ID
awarie w przypadku wyżej wymienionych problemów.źródło
Co powiesz na IMEI . Jest to unikalne rozwiązanie dla Androida lub innych urządzeń mobilnych.
źródło
Oto jak generuję unikalny identyfikator:
źródło
Moje dwa centy - NB, to jest za unikatowy identyfikator urządzenia - nie ten instalacyjny, jak omówiono na blogu programistów Androida .
Należy zauważyć, że rozwiązanie dostarczone przez @emmby ma identyfikator ID aplikacji, ponieważ SharedPreferences nie są synchronizowane między procesami (patrz tutaj i tutaj ). Więc całkowicie tego uniknąłem.
Zamiast tego hermetyzowałem różne strategie uzyskiwania identyfikatora (urządzenia) w wyliczeniu - zmiana kolejności stałych wyliczania wpływa na priorytet różnych sposobów uzyskiwania identyfikatora. Zwracany jest pierwszy niepusty identyfikator lub generowany jest wyjątek (zgodnie z dobrymi praktykami Java, aby nie nadawać null znaczenia). Na przykład mam najpierw TELEPHONY - ale dobrym wyborem domyślnym byłaby wersja ANDROID_ID beta:
źródło
Tutaj jest ponad 30 odpowiedzi, a niektóre są takie same, a niektóre są wyjątkowe. Ta odpowiedź jest oparta na kilku z tych odpowiedzi. Jednym z nich jest odpowiedź @Lenn Dolling.
Łączy 3 identyfikatory i tworzy 32-cyfrowy ciąg szesnastkowy. To działało dla mnie bardzo dobrze.
3 identyfikatory to:
Pseudo-identyfikator - jest generowany na podstawie fizycznych specyfikacji urządzenia
ANDROID_ID -
Settings.Secure.ANDROID_ID
adres Bluetooth - adres adaptera Bluetooth
Zwróci coś takiego: 551F27C060712A72730B0A0F734064B1
Uwaga: Zawsze możesz dodać więcej identyfikatorów do
longId
łańcucha. Na przykład numer seryjny. adres adaptera wifi. IMEI. W ten sposób czynisz go bardziej unikalnym dla każdego urządzenia.źródło
longId
pliku i zapisanie go w pliku sprawi, że będzie on najbardziej unikalnym identyfikatorem:String uuid = UUID.randomUUID().toString();
longId
. Zmień tę jedną linię w ten sposób:String longId = pseudoId + androidId + btId + UUID.randomUUID().toString();
Gwarantuje to, że wygenerowany identyfikator będzie unikalny.Innym sposobem jest korzystanie
/sys/class/android_usb/android0/iSerial
z aplikacji bez żadnych uprawnień.Aby to zrobić w Javie, wystarczy użyć FileInputStream, aby otworzyć plik iSerial i odczytać znaki. Tylko upewnij się, że umieścisz go w module obsługi wyjątków, ponieważ nie wszystkie urządzenia mają ten plik.
Wiadomo, że przynajmniej następujące urządzenia mają ten plik do odczytu na całym świecie:
Możesz także zobaczyć mój wpis na blogu Wyciekający numer seryjny sprzętu Android do nieuprzywilejowanych aplikacji, w którym omawiam, jakie inne pliki są dostępne do informacji.
źródło
TelephonyManger.getDeviceId () Zwraca unikalny identyfikator urządzenia, na przykład IMEI dla GSM i MEID lub ESN dla telefonów CDMA.
Ale polecam użyć:
Settings.Secure.ANDROID_ID, który zwraca identyfikator Androida jako unikalny 64-bitowy ciąg szesnastkowy.
Czasami TelephonyManger.getDeviceId () zwraca null, więc aby zapewnić unikalny identyfikator, użyjesz tej metody:
źródło
Aby rozpoznać sprzętowo określone urządzenie z Androidem, możesz sprawdzić adresy MAC.
możesz to zrobić w ten sposób:
w AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
teraz w kodzie:
Na każdym urządzeniu z Androidem ich interfejs jest co najmniej „wlan0”, a układ WI-FI. Ten kod działa nawet wtedy, gdy WI-FI nie jest włączony.
PS Ich jest wiele innych interfejsów, które otrzymasz z listy zawierającej MACS Ale to może się zmieniać między telefonami.
źródło
Używam następującego kodu, aby uzyskać
IMEI
lub użyć Bezpieczne.ANDROID_ID
alternatywnie, gdy urządzenie nie ma możliwości telefonu:źródło
Dokładniej
Settings.Secure.ANDROID_ID
. Jest to 64-bitowa ilość, która jest generowana i przechowywana przy pierwszym uruchomieniu urządzenia. Jest resetowany po wyczyszczeniu urządzenia.ANDROID_ID
wydaje się dobrym wyborem dla unikalnego identyfikatora urządzenia. Są wady: Po pierwsze, nie jest w 100% wiarygodny w wersjach Androida wcześniejszych niż 2.2.(“Froyo”).
Ponadto w popularnym telefonie od jednego z głównych producentów pojawił się co najmniej jeden powszechnie obserwowany błąd, w którym każda instancja ma ten sam ANDROID_ID.źródło
Aby zrozumieć dostępne unikalne identyfikatory na urządzeniach z Androidem. Skorzystaj z tego oficjalnego przewodnika.
Najlepsze praktyki dotyczące unikalnych identyfikatorów:
IMEI, adresy Mac, identyfikator wystąpienia, identyfikatory GUID, identyfikator SSAID, identyfikator reklamowy, interfejs API sieci bezpieczeństwa do weryfikacji urządzeń.
https://developer.android.com/training/articles/user-data-ids
źródło
Identyfikator wystąpienia Google
Wydany na I / O 2015; na Androida wymaga usług Play 7.5.
https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation
Wygląda na to, że Google zamierza użyć tego identyfikatora do identyfikacji instalacji na Androidzie, Chrome i iOS.
Identyfikuje instalację, a nie urządzenie, ale z drugiej strony ANDROID_ID (który jest akceptowaną odpowiedzią) nie rozpoznaje już urządzeń. W środowisku wykonawczym ARC generowany jest nowy ANDROID_ID dla każdej instalacji ( szczegóły tutaj ), podobnie jak ten nowy identyfikator instancji. Myślę też, że identyfikacja instalacji (a nie urządzeń) jest tym, czego tak naprawdę szuka większość z nas.
Zalety identyfikatora instancji
Wydaje mi się, że Google zamierza używać go w tym celu (identyfikując twoje instalacje), jest wieloplatformowy i może być wykorzystywany do wielu innych celów (patrz linki powyżej).
Jeśli używasz GCM, w końcu będziesz musiał użyć tego identyfikatora instancji, ponieważ jest on potrzebny, aby uzyskać token GCM (który zastępuje stary identyfikator rejestracji GCM).
Wady / problemy
W bieżącej implementacji (GPS 7.5) identyfikator instancji jest pobierany z serwera na żądanie aplikacji. Oznacza to, że powyższe połączenie jest połączeniem blokującym - w moich testach nienaukowych zajmuje 1-3 sekund, jeśli urządzenie jest w trybie online, i 0,5 - 1,0 sekundy, jeśli jest w trybie off-line (przypuszczalnie tyle czasu czeka przed rezygnacją i wygenerowaniem losowy identyfikator). Zostało to przetestowane w Ameryce Północnej na Nexusie 5 z Androidem 5.1.1 i GPS 7.5.
Jeśli używasz identyfikatora do celów, które zamierzają - np. uwierzytelnianie aplikacji, identyfikacja aplikacji, GCM - Myślę, że 1-3 sekundy mogą być uciążliwe (oczywiście w zależności od aplikacji).
źródło