Unikalny Numer Seryjny Androida

Rozwijam aplikację na Androida, która działa na Androida 4.0 (API 14) i nowsze.

Szukam numeru seryjnego, który jest unikalny na urządzenie i który utrzymuje się na zawsze(umiera wraz z urządzeniem, nie zmienia się po resecie fabrycznym).

Znalazłem wiele wyników w Internecie dotyczących unikalnych identyfikatorów dla urządzeń z Androidem, ale bardzo niewiele na android.os.Buduj.Numer seryjny .

Póki co wyeliminowałem użycie ANDROID_ID ponieważ może się zmienić po resetowaniu fabrycznym. Wyeliminowałem również użycie IMEI, ponieważ urządzenie z Androidem może nie być telefonem. Nie mogę korzystać z WiFi lub bluetooth adres MAC, ponieważ urządzenie może nie mieć takiego sprzętu i / lub takie adresy mac mogą nie być czytelne, jeśli sprzęt nie jest włączony (na podstawie tego, co znalazłem w Internecie).

Wydaje mi się, że mogę wybrać numer seryjny urządzenia z Androidem.

Jest łatwo dostępny za pomocą android.os.Buduj.SERIAL (ponieważ jest on dodawany w API na poziomie 9 i nie wymaga żadnych dodatkowych uprawnień).

Moje pytania to:

  • Biorąc pod uwagę, że moja aplikacja jest przeznaczona dla Androida 4.0 (API 14) i nowszych, jest to android .os.Buduj.Numer seryjny {[6] } dla urządzeń z Androidem unikalny dla każdego urządzenia ?

  • Obecnie dokumentacja Androida.os.Buduj.SERIAL oznacza: numer seryjny sprzętu, jeśli jest dostępny. Wyłącznie alfanumeryczne, nie rozróżnia wielkości liter. Czy to oznacza, że numer seryjny może nie być dostępny ?

  • Jaka może być inna alternatywa, która spełnia powyższe warunki ?

Author: Leeeeeeelo, 2013-04-18

4 answers

Biorąc pod uwagę, że moja aplikacja celuje Android 4.0 (API 14) i powyżej, jest android.os.Buduj.Numer seryjny dla urządzeń z systemem android unikalny dla każdego urządzenia ?

Zgodnie z tym przydatnym artykułem w blogu programistów Androida, android.os.Build.SERIAL powinien być unikalny, jeśli jest dostępny. Z artykułu:

urządzenia bez telefonii muszą zgłosić tutaj unikalny identyfikator urządzenia; niektóre telefony mogą to zrobić również.

Czy to oznacza, że numer seryjny może nie być dostępny ?

Zgadza się, może nie być dostępna. Zauważ, że mówią " urządzenia bez telefonii są wymagane...", więc tylko urządzenia bez" telefonii " (jak Wifi tylko tablety) są wymagane do dostarczenia numeru SERIAL, chociaż niektóre telefony nadal tak robią (jak Nexus 4).

W tym temacie zdecydowanie brakuje dokumentacji, ale z sformułowania wynika, że tylko "urządzenia bez telefonii" są wymagane do przesłania unikalnego identyfikatora, podczas gdy telefony, które go przesyłają, mogą nie być unikalne.

Jaka może być inna alternatywa, która spełnia powyższe warunki ?

Dla twojej sytuacji myślę, że najlepiej jest najpierw sprawdzić deviceId (IMEI, czy co nie), a jeśli deviceId nie istnieje, to możesz użyć android.os.Build.SERIAL (ponieważ to prawdopodobnie tablet) w ten sposób:

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return android.os.Build.SERIAL;
    }
}

Pamiętaj, aby używać deviceId potrzebujesz pozwolenie android.permission.READ_PHONE_STATE.

Więc ponieważ minSDK Twojej aplikacji wynosi 14, możesz bezpiecznie korzystać z pola android.os.Build.SERIAL. A jeśli założymy, że urządzenia bez telefonii naprawdę zawsze dostarczają unikalne identyfikatory w SERIAL, to myślę, że byłoby to bezpieczne zakład na zawsze uzyskanie unikalnego identyfikatora urządzenia (Oczywiście bez błędów).

 49
Author: Tony Chan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-08 22:32:05

Ja osobiście używam Secure.ANDROID_ID & Build.SERIAL aby zidentyfikować telefon:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.ANDROID_ID) + Build.SERIAL;

Mogą mieć to samo ANDROID_ID, mogą nie mieć SERIAL. Ale szansa na jedno i drugie jest niska.

 9
Author: Kai Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 21:54:22

Wygląda na to, że dobrze podsumowałeś sytuację.

Numer seryjny ma być unikalny dla każdego urządzenia, ale (tym razem Android) są oczywiście błędy, które tworzą wyjątki, np. https://code.google.com/p/android/issues/detail?id=35193

Jak zauważyłeś, dokumenty sugerują, że ma to być numer seryjny sprzętu, ale sposób jego sformułowania sugeruje, że nie powinieneś na to liczyć. I nie myl tego z rzeczywistym urządzeniem numer seryjny, tj. numer seryjny wydrukowany na odwrocie lub na pudełku. Jak również, uważam, że jest znacznie mniej szeroko stosowany niż android_id, więc mogą być problemy, które nie są zgłaszane.

Widziałem, jak powszechnie informowano, że android_id opiera się na numerze seryjnym, ale uważam, że nie jest to prawda - ostatnio zauważyłem, że na tablecie z nową funkcją multi-user, każde konto użytkownika otrzymuje swój własny android_id, ale numer seryjny jest taki sam dla obu.

AFAIK "inna alternatywa" nie istnieje: Twoja lista jest kompletna. Numer seryjny jest najbliższy temu, czego szukasz, chyba że jesteś przygotowany na uzależnienie od uprawnień wifi lub bluetooth.

 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 00:19:40

Zazwyczaj dostaję unikalne id, wykonując hash SHA1 jakiegoś unikalnego ciągu znaków (Nazwa firmy zwykle) + imei (jeśli nie ma imei, adres mac [wifi, bluetooth, itp]). Daje mi to unikalne identyfikatory, które wyglądają tak samo, wydają się być unikalne na urządzenie (nie idealne, jeśli MAC jest zmieniony/sfałszowany).

 0
Author: Ryan Schultz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 00:26:10