2010-08-12 10 views
6

Me gustaría poder generar números de serie únicos para cada dispositivo Android para desbloquear una aplicación. ¿Cómo podría hacer esto?Generando un número de serie específico del dispositivo

EDIT:

La razón es que quiero renovar una aplicación de pago y proporcionar a los usuarios que han pagado por la versión antigua, lo que tendrá un nombre de paquete diferente, una manera de obtener la versión completa mediante la descarga de un desbloqueable versión gratuita de la aplicación. Presioné una actualización de la versión anterior que generaría y mostraría el código que podrían ingresar para convertir la versión gratuita en una versión completamente funcional.

Respuesta

6

Puede usar el Android id. Esta identificación debe ser exclusiva de los dispositivos, pero la forma en que se configura depende de la implementación del fabricante del dispositivo.

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

el ID de Android pueden cambiar el restablecimiento de fábrica del teléfono y el usuario también es capaz de cambiarlo en teléfonos libres. Pero si necesita una identificación para identificar a su usuario, debería estar bien.

+2

Desafortunadamente, ha habido fabricantes en el pasado que establecieron ANDROID_ID como nulo, o peor, ¡el mismo en todos los dispositivos! Ver [este hilo] (http://stackoverflow.com/questions/2785485/is-there-a-unique-android-dispositivo-id) sobre eso. – Andrew

0

Puede usar el IMEI no para esto.

+0

Yo no usaría el IMEI para esta. El acceso al imei necesita permisos especiales que parecen que estás usando datos que no debes usar y que hacen que los usuarios sospechen. El imei no es nada que debas guardar sin teléfono. – Janusz

1

Android ya proporciona un licensing service para el uso de aplicaciones pagas. ¿Hay alguna razón por la que no quieras usar esto? Tenga en cuenta que tratar de bloquear su aplicación a un teléfono en particular realmente molestará a los usuarios que cambian de dispositivo (por ejemplo, todos ellos tarde o temprano).

+0

Agregó la razón para hacer la pregunta –

7

¿por qué no utilizar el nombre de la cuenta de google? es fácil de obtener y solo necesita una simple solicitud en el archivo de manifiesto. habrán comprado la licencia con gplay, por lo que la cuenta de G + nombre debería ser suficiente ...

en el manifiesto:

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

para recuperar el nombre de la cuenta:

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

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

para recuperar el nombre:

accounts[0].name 

escribo una alerta simple para asegurarse de que he encontrado una cuenta aquí th toda correo código:

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

Usted puede utilizar el número de serie como un identificador único, ya que son availbalble en toda devices.You no deben usar el IMEI como un identificador único, ya que no están en abalibale WIFI Tabs (pestañas que no lo hacen tener ranura para tarjeta SIM).

Puede utilizar

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

De La solución de Google para desarrolladores en la solución problema con PRNG, obtener el número de serie único de dispositivo a través de la reflexión:

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; 
    } 
} 
Cuestiones relacionadas