Come recuperare un ID univoco per identificare i dispositivi Android?

Alcuni sviluppatori possono aver bisogno di un ID univoco per identificare i dispositivi Android. I casi in cui gli sviluppatori necessitano di questo ID univoco sono multipli. Ad esempio, quando si desidera:

  • identificare un utente Android per archiviare i punteggi dei giochi su un server
  • traccia l'installazione delle app
  • generare DRM per la protezione dalla copia.

Esistono diverse soluzioni ma nessuna è perfetta. In questo tutorial esamineremo cinque soluzioni e presenteremo i loro svantaggi:

1. Numero di telefonia unico (IMEI, MEID, ESN, IMSI)

Se scegli come target solo gli smartphone, puoi approfittare del fatto che il dispositivo ha servizi di telefonia. Quindi, puoi facilmente recuperare un ID univoco che identifica il dispositivo.

Questo ID univoco può essere IMEI, MEID, ESN o IMSI. Possono essere definiti come segue:

  • IMEI per International Mobile Equipment Identity: il numero univoco per identificare i telefoni cellulari GSM, WCDMA e alcuni telefoni satellitari
  • MEID per identificatore di apparecchiature mobili: il numero univoco globale che identifica un pezzo fisico di apparecchiature di stazioni mobili CDMA, il MEID è stato creato per sostituire gli ESN (numero di serie elettronico)
  • ESN per numero seriale elettronico: il numero univoco per identificare i telefoni cellulari CDMA
  • IMSI (International Mobile Subscriber Identity): l'identificazione univoca associata a tutti gli utenti di telefonia mobile della rete GSM e UMTS

Per recuperare l'ID univoco associato al dispositivo, è possibile utilizzare il seguente codice:

import android.telephony.TelephonyManager;
import android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService (Contesto.
                    TELEPHONY_SERVICE);
/ *
* getDeviceId () restituisce l'ID dispositivo univoco.
* Ad esempio, l'IMEI per GSM e il MEID o ESN per i telefoni CDMA.
* /
String deviceId = telephonyManager.getDeviceId ();
/ *
* getSubscriberId () restituisce l'ID abbonato univoco,
* Ad esempio, l'IMSI per un telefono GSM.
* /
String subscriberId = telephonyManager.getSubscriberId ();

Questa soluzione deve richiedere al tuo utente android.permission.READ_PHONE_STATE che può essere difficile da giustificare in base al tipo di applicazione che hai fatto.

Inoltre, questa soluzione è limitata agli smartphone perché i tablet non dispongono di servizi di telefonia. Un vantaggio è che il valore sopravvive ai ripristini di fabbrica sui dispositivi.

2. Indirizzo MAC

Puoi anche provare a ottenere un indirizzo MAC da un dispositivo con un hardware Wi-Fi o Bluetooth. Tuttavia, questa soluzione non è consigliata perché non tutti i dispositivi dispongono di connessione Wi-Fi. Anche se l'utente dispone di una connessione Wi-Fi, deve essere attivato per recuperare i dati. In caso contrario, la chiamata non segnala l'indirizzo MAC.

3. Numero di serie

I dispositivi senza servizi di telefonia come i tablet devono riportare un ID dispositivo univoco disponibile tramite android.os.Build.SERIAL da Android 2.3 Gingerbread. Alcuni telefoni con servizi di telefonia possono anche definire un numero seriale. Come non tutti i dispositivi Android hanno un numero di serie, questa soluzione non è affidabile.

4. ID Android sicuro

Al primo avvio del dispositivo, viene generato e memorizzato un valore casuale. Questo valore è disponibile tramite Settings.Secure.ANDROID_ID. È un numero a 64 bit che dovrebbe rimanere costante per la durata di un dispositivo. ANDROID_ID sembra una buona scelta per un identificatore univoco del dispositivo perché è disponibile per smartphone e tablet. Per recuperare il valore, è possibile utilizzare il seguente codice:

String androidId = Settings.Secure.getString (getContentResolver (),
                     Settings.Secure.ANDROID_ID);

Tuttavia, il valore può cambiare se viene eseguito un ripristino di fabbrica sul dispositivo. Esiste anche un bug noto con un telefono popolare di un produttore in cui ogni istanza ha lo stesso ANDROID_ID. Chiaramente, la soluzione non è affidabile al 100%.

5. Usa UUID

Poiché il requisito per la maggior parte delle applicazioni è identificare una particolare installazione e non un dispositivo fisico, una buona soluzione per ottenere un ID univoco per un utente se utilizzare la classe UUID. La seguente soluzione è stata presentata da Reto Meier di Google in una presentazione I / O di Google:

stringa statica privata uniqueID = null;
Stringa finale statica privata PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
ID stringa statica sincronizzata pubblica (contesto contesto) {
   if (uniqueID == null) {
      SharedPreferences sharedPrefs = context.getSharedPreferences (
         PREF_UNIQUE_ID, Context.MODE_PRIVATE);
      uniqueID = sharedPrefs.getString (PREF_UNIQUE_ID, null);
      if (uniqueID == null) {
         uniqueID = UUID.randomUUID (). toString ();
         Editor editor = sharedPrefs.edit ();
         editor.putString (PREF_UNIQUE_ID, uniqueID);
         editor.commit ();
      }
   }
    restituire uniqueID;
}

Il metodo UUID.randomUUID () genera un identificatore univoco per un'installazione specifica. Devi solo memorizzare quel valore e il tuo utente verrà identificato al prossimo avvio dell'applicazione. Puoi anche provare ad associare questa soluzione al servizio di backup Android per mantenere le informazioni disponibili per l'utente anche se installa l'applicazione su un altro dispositivo.

Conclusione

Identificare un dispositivo particolare su Android non è una cosa facile. Ci sono molte buone ragioni per evitarlo. La soluzione migliore è probabilmente quella di identificare una particolare installazione utilizzando la soluzione UUID. Tuttavia, se si desidera identificare fisicamente un determinato dispositivo fisicamente, è possibile provare a utilizzare la soluzione ANDROID_ID. Non affidabile al 100% ma migliore di altre soluzioni.