Muszę używać unikalnego identyfikatora aplikacji na Androida i pomyślałem, że numer seryjny urządzenia będzie dobrym kandydatem. Jak odzyskać numer seryjny urządzenia z systemem Android w mojej aplikacji?
115
Muszę używać unikalnego identyfikatora aplikacji na Androida i pomyślałem, że numer seryjny urządzenia będzie dobrym kandydatem. Jak odzyskać numer seryjny urządzenia z systemem Android w mojej aplikacji?
Odpowiedzi:
getSystemService to metoda z klasy Activity. getDeviceID () zwróci MDN lub MEID urządzenia w zależności od tego, jakiego radia używa telefon (GSM lub CDMA).
Każde urządzenie MUSI zwrócić tutaj unikalną wartość (zakładając, że jest to telefon). To powinno działać na każdym urządzeniu z Androidem z gniazdem karty SIM lub radiem CDMA. Dzięki tej kuchence mikrofalowej z systemem Android jesteś sam ;-)
źródło
Jak wspomina Dave Webb, na blogu programistów Androida znajduje się artykuł na ten temat.
Rozmawiałem z kimś w Google, aby uzyskać dodatkowe wyjaśnienia dotyczące kilku kwestii. Oto, co odkryłem, a NIE zostało wspomniane we wspomnianym poście na blogu:
Opierając się na zaleceniach Google, zaimplementowałem klasę, która będzie generować unikalny UUID dla każdego urządzenia, używając ANDROID_ID jako zarodka tam, gdzie to konieczne, w razie potrzeby powracając do TelephonyManager.getDeviceId (), a jeśli to się nie powiedzie, uciekając się do losowo wygenerowanego unikalnego UUID który jest utrwalany po ponownym uruchomieniu aplikacji (ale nie podczas ponownych instalacji aplikacji).
źródło
Ten kod zwraca numer seryjny urządzenia przy użyciu ukrytego interfejsu API systemu Android.
źródło
Chociaż nie ma gwarancji, że identyfikator Androida będzie unikalnym identyfikatorem.
źródło
getContentResolver
wracanull
. Warto jednak otworzyć pytanie i zamieścić swój kod.Na blogu programistów Androida znajduje się świetny post omawiający to .
Odradza używanie,
TelephonyManager.getDeviceId()
ponieważ nie działa na urządzeniach z Androidem, które nie są telefonami, takimi jak tablety, wymagaREAD_PHONE_STATE
pozwolenia i nie działa niezawodnie na wszystkich telefonach.Zamiast tego możesz użyć jednego z następujących:
W poście omówiono zalety i wady każdego z nich i warto go przeczytać, abyś mógł ustalić, który z nich będzie najlepszy do Twojego użytku.
źródło
Aby uzyskać prosty numer, który jest unikalny dla urządzenia i niezmienny przez cały okres jego eksploatacji (z wyjątkiem przywrócenia ustawień fabrycznych lub włamań), użyj opcji Settings.Secure.ANDROID_ID .
Aby użyć numeru seryjnego urządzenia (tego pokazanego w „Ustawieniach systemu / Informacje / Stan”), jeśli jest dostępny, i wrócić do identyfikatora Androida:
źródło
IMEI jest dobry, ale działa tylko na urządzeniach z Androidem z telefonem. Powinieneś rozważyć obsługę tabletów lub innych urządzeń z Androidem, które nie mają telefonu.
Masz kilka alternatyw, takich jak: Kompiluj członków klasy, BT MAC, WLAN MAC lub jeszcze lepiej - kombinacja wszystkich tych.
Wyjaśniłem te szczegóły w artykule na moim blogu, patrz: http://www.pocketmagic.net/?p=1662
źródło
Ponieważ żadna odpowiedź nie wspomina o idealnym, niezawodnym identyfikatorze, który jest zarówno TRWAŁY dzięki aktualizacjom systemu, jak i istnieje na WSZYSTKICH urządzeniach (głównie ze względu na brak indywidualnego rozwiązania od Google), zdecydowałem się opublikować metodę, która jest Następną najlepszą rzeczą jest połączenie dwóch dostępnych identyfikatorów i sprawdzenie, czy wybierzesz między nimi w czasie wykonywania.
Przed kodem, 3 fakty:
TelephonyManager.getDeviceId()
(akaIMEI) nie będzie działać dobrze lub w ogóle nie będzie działać na urządzeniach innych niż GSM, 3G, LTE itp., ale zawsze zwróci unikalny identyfikator, gdy powiązany jest sprzęt , nawet gdy nie jest włożona karta SIM lub nawet gdy nie ma gniazda SIM ( niektórzy producenci OEM to zrobili).Ponieważ Gingerbread (Android 2.3)
android.os.Build.SERIAL
musi istnieć na każdym urządzeniu, które nie zapewnia IMEI , tj. Nie ma wspomnianego sprzętu, zgodnie z zasadami Androida.Z uwagi na fakt (2.), co najmniej jeden z tych dwóch unikalnych identyfikatorów będzie ZAWSZE obecny , a SERIAL może być obecny w tym samym czasie co IMEI.
Uwaga: Fakty (1.) i (2.) opierają się na oświadczeniach Google
ROZWIĄZANIE
Biorąc pod uwagę powyższe fakty, zawsze można mieć unikalny identyfikator, sprawdzając, czy istnieje sprzęt powiązany z IMEI, i powrócić do SERIALU, gdy go nie ma, ponieważ nie można sprawdzić, czy istniejący SERIAL jest ważny. Poniższa klasa statyczna przedstawia 2 metody sprawdzania takiej obecności i korzystania z IMEI lub SERIAL:
Radziłbym używać
getCleartextID_HARDCHECK
. Jeśli odbicie nie trzyma się w Twoim otoczeniu, użyjgetCleartextID_SIMCHECK
zamiast tego metody, ale weź pod uwagę, że powinna być dostosowana do Twoich konkretnych potrzeb w zakresie obecności karty SIM.PS : Proszę zauważyć, że producentom OEM udało się wyprowadzić błąd SERIAL z zasadami Google (wiele urządzeń z tym samym SERIALEM), a Google, jak stwierdzono, istnieje co najmniej jeden znany przypadek w przypadku dużego producenta OEM (nie ujawniono i nie wiem, która marka to też, zgaduję, Samsung).
Zastrzeżenie : To odpowiedź na pierwotne pytanie o uzyskanie unikalnego identyfikatora urządzenia, ale OP wprowadził niejednoznaczność, stwierdzając, że potrzebuje unikalnego identyfikatora dla aplikacji. Nawet jeśli w takich scenariuszach Android_ID byłby lepszy, NIE BĘDZIE DZIAŁAŁ po, powiedzmy, kopii zapasowej Titanium aplikacji poprzez 2 różne instalacje ROM (może to być nawet ten sam ROM). Moje rozwiązanie zachowuje trwałość, która jest niezależna od flashowania lub resetowania do ustawień fabrycznych i zawiedzie tylko wtedy, gdy nastąpi manipulacja IMEI lub SERIAL przez hacki / modyfikacje sprzętowe.
źródło
Z wszystkimi powyższymi podejściami są problemy. W Google i / o Reto Meier wydał solidną odpowiedź na to, jak podejść do tego problemu, która powinna zaspokoić potrzeby większości programistów w zakresie śledzenia użytkowników w różnych instalacjach.
Takie podejście zapewnia anonimowy, bezpieczny identyfikator użytkownika, który będzie trwały dla użytkownika na różnych urządzeniach (w tym tabletach, w oparciu o podstawowe konto Google) i podczas instalacji na tym samym urządzeniu. Podstawowym podejściem jest wygenerowanie losowego identyfikatora użytkownika i zapisanie go we wspólnych preferencjach aplikacji. Następnie korzystasz z agenta kopii zapasowych Google do przechowywania wspólnych preferencji połączonych z kontem Google w chmurze.
Przejdźmy przez pełne podejście. Najpierw musimy utworzyć kopię zapasową naszych SharedPreferences przy użyciu usługi Android Backup Service. Zacznij od rejestracji aplikacji za pomocą tego linku: http://developer.android.com/google/backup/signup.html
Google dostarczy Ci zapasowy klucz serwisowy, który musisz dodać do manifestu. Musisz także powiedzieć aplikacji, aby używała BackupAgent w następujący sposób:
Następnie musisz utworzyć agenta kopii zapasowych i powiedzieć mu, aby używał agenta pomocniczego dla wspólnych preferencji:
Aby zakończyć tworzenie kopii zapasowej, musisz utworzyć instancję BackupManager w swojej głównej aktywności:
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 we wszystkich instalacjach, nawet jeśli użytkownik zmieni urządzenia.
Aby uzyskać więcej informacji na temat tego podejścia, zobacz wykład Reto tutaj http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html
Aby uzyskać szczegółowe informacje o tym, jak wdrożyć agenta kopii zapasowych, odwiedź witrynę programistów tutaj: http://developer.android.com/guide/topics/data/backup.html Szczególnie polecam sekcję na dole dotyczącą testowania, ponieważ robi to kopia zapasowa nie dzieje się natychmiast, więc aby przetestować, musisz wymusić tworzenie kopii zapasowej.
źródło
Innym sposobem jest użycie / sys / class / android_usb / android0 / iSerial w aplikacji bez jakichkolwiek uprawnień.
Aby to zrobić w Javie, wystarczy użyć FileInputStream, aby otworzyć plik iSerial i odczytać znaki. Tylko pamiętaj, aby umieścić go w obsłudze wyjątków, ponieważ nie wszystkie urządzenia mają ten plik.
Przynajmniej następujące urządzenia są znane z tego, że ten plik jest czytelny dla wszystkich:
Możesz również zobaczyć mój post na blogu tutaj: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html, gdzie omawiam, jakie inne pliki są dostępne dla informacji.
źródło
Jak mówi @haserman:
Konieczne jest jednak uwzględnienie pozwolenia w pliku manifestu:
źródło
Unikalny identyfikator urządzenia z systemem operacyjnym Android jako ciąg.
ale zdecydowanie polecam tę metodę sugerowaną przez Google:
Identyfikowanie instalacji aplikacji
źródło
Build.SERIAL
to najprostszy sposób, chociaż nie do końca niezawodny, ponieważ może być pusty lub czasami zwracać inną wartość ( dowód 1 , dowód 2 ) niż to, co możesz zobaczyć w ustawieniach urządzenia.Istnieje kilka sposobów uzyskania tego numeru w zależności od producenta urządzenia i wersji Androida, więc zdecydowałem się skompilować każde możliwe rozwiązanie, które mogłem znaleźć w jednym skrócie . Oto uproszczona wersja:
źródło
Wiem, że to pytanie jest stare, ale można to zrobić w jednej linii kodu
String deviceID = Build.SERIAL;
źródło
Uważam, że przykładowa klasa opublikowana przez @emmby powyżej jest świetnym punktem wyjścia. Ale ma kilka wad, o których wspominają inne plakaty. Głównym z nich jest to, że niepotrzebnie utrwala identyfikator UUID w pliku XML, a następnie zawsze pobiera go z tego pliku. To otwiera klasę na łatwy hack: każdy, kto ma zrootowany telefon, może edytować plik XML, aby nadać sobie nowy identyfikator UUID.
Zaktualizowałem kod, aby zachowywał się w formacie XML tylko wtedy, gdy jest to absolutnie konieczne (np. Podczas korzystania z losowo wygenerowanego identyfikatora UUID) i ponownie rozłożyłem logikę zgodnie z odpowiedzią @Brill Pappin:
źródło
Tak. Jest to numer seryjny sprzętu urządzenia i jest unikalny. Tak więc na poziomie API 2.3 i nowszym możesz użyć android.os.Build.ANDROID_ID, aby go pobrać. Dla poziomu API poniżej 2.3 użyj TelephonyManager.getDeviceID () .
możesz przeczytać ten http://android-developers.blogspot.in/2011/03/identifying-app-installations.html
źródło