2010-08-12 18 views
6

Vorrei poter generare numeri di serie univoci per ciascun dispositivo Android da utilizzare per sbloccare un'applicazione. Come potrei farlo?Generazione di un numero di serie specifico del dispositivo

EDIT:

Il motivo è che voglio rinnovare un'applicazione a pagamento e fornire agli utenti che hanno pagato per la vecchia versione, che avrà un nome pacchetto diverso, un modo per ottenere la versione completa scaricando una sbloccabile versione gratuita dell'applicazione. Spingevo un aggiornamento alla vecchia versione che generasse e mostrasse il codice che potevano inserire per trasformare la versione gratuita in una versione completamente funzionante.

risposta

6

È possibile utilizzare Android id. Questo ID deve essere univoco per i dispositivi, ma il modo in cui viene impostato dipende dall'implementazione del produttore del dispositivo.

String deviceId = Secure.getString(context.getContentResolver(),Secure.ANDROID_ID); 

L'Id Android possano cambiare reset di fabbrica del telefono e l'utente è anche in grado di cambiarlo su telefoni radicati. Ma se hai bisogno di un ID per identificare il tuo utente, dovrebbe andare bene.

+2

Purtroppo, in passato ci sono stati produttori che hanno impostato ANDROID_ID come null o, peggio, uguale su tutti i dispositivi! Vedi [questo thread] (http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id) a riguardo. – Andrew

0

È possibile utilizzare il numero IMEI per questo.

+0

Non vorrei usare l'imei per Questo. Accedere a imei richiede permessi speciali che sembrano utilizzare dati che non dovresti usare e rendere gli utenti sospetti. L'imei non è nulla che dovresti conservare senza telefono. – Janusz

1

Android fornisce già un licensing service per l'utilizzo da parte di app a pagamento. C'è una ragione per cui non vuoi usare questo? Ricorda che tentare di bloccare la tua app su un telefono particolare infastidisce davvero gli utenti che cambiano dispositivo (ad esempio, tutti, prima o poi).

+0

Aggiunta la ragione per chiedere alla domanda –

7

perché non utilizzare il nome dell'account google? è facile da ottenere e richiede solo una semplice richiesta sul file manifest. essi hanno acquistato la licenza con GPLAY, in modo che l'account G + nome dovrebbe essere sufficiente ...

nel manifesto:

<manifest ... > 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    ... 
</manifest> 

per recuperare il nome account:

AccountManager am = AccountManager.get(this); // "this" references the current Context 

Account[] accounts = am.getAccountsByType("com.google"); 

per recuperare il nome:

accounts[0].name 

ho scritto un semplice avviso per essere sicuro di aver trovato un account qui e il codice intero:

Account[] accounts = am.getAccountsByType("com.google"); 
    AlertDialog.Builder miaAlert = new AlertDialog.Builder(this); 

    miaAlert.setTitle("i found an account name!"); 
    miaAlert.setMessage(accounts[0].name); 
    AlertDialog alert = miaAlert.create(); 
    alert.show(); 
0

È possibile utilizzare il numero di serie come un identificatore univoco in quanto sono availbalble in tutta devices.You non dovrebbe usare IMEI come un identificatore univoco in quanto non sono abalibale in WiFi Tabs (linguette che non lo fanno avere lo slot per scheda SIM).

È possibile utilizzare

try { 
     Class<?> c = Class.forName("android.os.SystemProperties"); 
     Method get = c.getMethod("get", String.class, String.class); 
     serial = (String) get.invoke(c, "ril.serialnumber", "unknown"); 
    } catch (Exception ignored) { 
    } 
1

Dalla soluzione di Google per sviluppatori a risolvere problema con il PRNG, ottenendo il numero di serie del dispositivo unico nel suo genere attraverso la riflessione:

http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html

/** 
* Gets the hardware serial number of this device. 
* 
* @return serial number or {@code null} if not available. 
*/ 
private static String getDeviceSerialNumber() { 
    // We're using the Reflection API because Build.SERIAL is only available 
    // since API Level 9 (Gingerbread, Android 2.3). 
    try { 
     return (String) Build.class.getField("SERIAL").get(null); 
    } catch (Exception ignored) { 
     return null; 
    } 
}