Vissa utvecklare kan behöva ett unikt ID för att identifiera Android-enheter. Användningsfallen där utvecklare behöver detta unika ID är flera.
Till exempel när du vill :
- identifiera en Android-användare för att lagra spelresultat på en server
- spåra installation av appar
- genererar DRM för kopieringsskydd.
Det finns flera lösningar, men ingen är perfekt. I den här handledningen kommer vi att undersöka fem lösningar och presentera deras nackdelar :
1. Unikt telefonnummer (IMEI, MEID, ESN, IMSI)
Om du endast riktar dig till smartphones kan du dra nytta av att enheten har telefonitjänster, så du kan enkelt hämta ett unikt ID som identifierar enheten.
Detta unika ID kan vara IMEI, MEID, ESN eller IMSI. De kan definieras enligt följande :
- IMEI för International Mobile Equipment Identity : det unika numret för att identifiera GSM- och WCDMA-mobiltelefoner samt vissa satellittelefoner
- MEID för Mobile Equipment IDentifier : det globalt unika numret som identifierar en fysisk del av CDMA-mobilstationsutrustningen, MEID skapades för att ersätta ESN:s (Electronic Serial Number)
- ESN för Electronic Serial Number : det unika numret för att identifiera CDMA-mobiltelefoner
- IMSI (International Mobile Subscriber Identity) : den unika identifiering som är förknippad med alla mobiltelefonanvändare i GSM- och UMTS-nätet
För att hämta det unika ID som är förknippat med din enhet kan du använda följande kod :
Den här lösningen måste begära för android.permission.READ_PHONE_STATE till din användare, vilket kan vara svårt att motivera med tanke på den typ av applikation som du har gjort.
Den här lösningen är dessutom begränsad till smartphones eftersom surfplattor inte har telefonitjänster. En fördel är att värdet överlever till fabriksåterställningar på enheter.
2. MAC-adress
Du kan också försöka få fram en MAC-adress från en enhet som har Wi-Fi- eller Bluetooth-hårdvara. Men den här lösningen rekommenderas inte eftersom inte alla enheter har Wi-Fi-anslutning. Även om användaren har en Wi-Fi-anslutning måste den vara påslagen för att hämta data. Annars rapporterar samtalet inte MAC-adressen.
3. Serienummer
Enheter utan telefonitjänster, t.ex. surfplattor, måste rapportera ett unikt enhets-ID som är tillgängligt via android.os.Build.SERIAL sedan Android 2.3 Gingerbread. Vissa telefoner som har telefonitjänster kan också definiera ett serienummer. Eftersom inte alla Android-enheter har ett serienummer är den här lösningen inte tillförlitlig.
4. Säkert Android-ID
När enheten startas upp första gången genereras och lagras ett slumpmässigt värde. Detta värde är tillgängligt via Settings.Secure.ANDROID_ID . Det är ett 64-bitars nummer som ska vara konstant under enhetens livstid. ANDROID_ID verkar vara ett bra val för en unik enhetsidentifierare eftersom det är tillgängligt för smartphones och surfplattor. För att hämta värdet kan du använda följande kod :
String androidId = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);
Värdet kan dock ändras om en fabriksåterställning utförs på enheten. Det finns också ett känt fel med en populär telefon från en tillverkare där varje instans har samma ANDROID_ID. Det är uppenbart att lösningen inte är 100 % tillförlitlig.
5. Använd UUID
Eftersom kravet för de flesta tillämpningar är att identifiera en viss installation och inte en fysisk enhet, är en bra lösning för att få ett unikt ID för en användare att använda UUID-klassen. Följande lösning har presenterats av Reto Meier från Google i en Google I/O-presentation :
UUID.randomUUUID()-metoden genererar en unik identifierare för en specifik installation. Du behöver bara lagra detta värde och din användare kommer att identifieras vid nästa start av din applikation. Du kan också försöka associera den här lösningen med Android Backup-tjänsten för att hålla informationen tillgänglig för användaren även om han installerar din applikation på en annan enhet.
Slutsats
Det är inte lätt att identifiera en viss enhet på Android. Det finns många goda skäl att undvika det. Den bästa lösningen är förmodligen att identifiera en viss installation med hjälp av en UUID-lösning. Men om du absolut vill identifiera en viss enhet fysiskt kan du försöka använda ANDROID_ID-lösningen. Inte 100 % tillförlitlig men bättre än andra lösningar.