Generación de número de serie específico del dispositivo

Me gustaría poder generar números de serie únicos para cada dispositivo Android para su uso en el desbloqueo de una aplicación. ¿Cómo podría hacer esto?

EDITAR:

La razón es que quiero renovar una aplicación de pago y proporcionar a los usuarios que han pagado por la versión anterior, que tendrá un nombre de paquete diferente, una forma de obtener la versión completa mediante la descarga de una versión desbloqueable libre de la aplicación. Empujaría una actualización a la vieja versión que generaría y exhibiría el código que podrían incorporar para dar vuelta a la versión libre en una versión completamente funcional.

Puede utilizar el ID de Android . Este id debe ser exclusivo de los dispositivos, pero la forma en que se establece depende de la implementación del fabricante del dispositivo.

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

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

¿Por qué no usar el nombre de cuenta de google? Es fácil de obtener y sólo necesita una simple solicitud en el archivo de manifiesto. Ellos habrán comprado la licencia con gplay, así que el nombre de la cuenta de g + 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 

Yo escribo una alerta simple para hacerme seguro que he encontrado una cuenta aquí el código entero:

 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(); 

Android ya proporciona un servicio de licencias para su uso en aplicaciones pagadas. ¿Hay alguna razón por la que no quiera usar esto? Tenga en cuenta que tratar de bloquear su aplicación a un teléfono en particular va a molestar a los usuarios que cambian dispositivos (por ejemplo, todos ellos, tarde o temprano).

Desde la solución de Google Developer en la solución de problemas con PRNG, obteniendo el número de serie único del dispositivo mediante 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; } } 

Puede usar el IMEI no para esto.

Puede utilizar el número de serie como un identificador único, ya que están disponibles en todos los dispositivos. No debe utilizar IMEI como un identificador único, ya que no son abalibales en las pestañas WIFI (pestañas que no tienen ranura para tarjeta SIM).

Puedes usar

  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) { } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.