Saltar al contenido

Android: Cómo acceder mediante programación al número de serie del dispositivo que se muestra en el administrador de AVD (API Versión 8)

Solución:

Este es el número de serie del hardware. Para acceder a él en

  • Android Q (> = SDK 29)
    android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE es requerido. Solo las aplicaciones del sistema pueden requerir este permiso. Si el paquete de llamada es el propietario del dispositivo o del perfil, READ_PHONE_STATE el permiso es suficiente.

  • Android 8 y posterior (> = SDK 26) uso android.os.Build.getSerial() que requiere el permiso peligroso READ_PHONE_STATE. Utilizando android.os.Build.SERIAL devuelve android.os.Build.UNKNOWN.

  • Android 7.1 y anterior (<= SDK 25) y anteriores android.os.Build.SERIAL devuelve una serie válida.

Es único para cualquier dispositivo. Si está buscando posibilidades sobre cómo obtener / usar una identificación de dispositivo única, debe leer aquí.

Para obtener una solución que implique la reflexión sin requerir un permiso, consulte esta respuesta.

Hasta Android 7.1 (SDK 25)

Hasta Android 7.1 lo obtendrás con:

Build.SERIAL

Desde Android 8 (SDK 26)

En Android 8 (SDK 26) y superior, este campo volverá UNKNOWN y se debe acceder con:

Build.getSerial()

que requiere el permiso peligroso
android.permission.READ_PHONE_STATE.

Desde Android Q (SDK 29)

Desde Android Q usando Build.getSerial() se vuelve un poco más complicado al requerir:

android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE (que solo pueden adquirir las aplicaciones del sistema), o para que el paquete de llamadas sea el propietario del dispositivo o perfil y tener el READ_PHONE_STATE permiso. Esto significa que la mayoría de las aplicaciones no podrán utilizar esta función. Vea el anuncio de Android Q de Google.

Ver la referencia del SDK de Android


Mejores prácticas para el identificador único de dispositivo

Si solo necesita un identificador único, es mejor evitar el uso de identificadores de hardware, ya que Google intenta continuamente dificultar el acceso a ellos por razones de privacidad. Podrías generar un UUID.randomUUID().toString(); y guárdelo la primera vez que necesite acceder a él en, por ejemplo, preferencias compartidas. Alternativamente, podría usar ANDROID_ID que es una cadena hexadecimal de 8 bytes de longitud exclusiva para el dispositivo, el usuario y la instalación de la aplicación (solo Android 8+). Para obtener más información sobre ese tema, consulte Prácticas recomendadas para identificadores únicos.

Build.SERIAL puede estar vacío o, a veces, devolver un valor diferente (prueba 1, prueba 2) del que puede ver en la configuración de su dispositivo.

Si desea una solución más completa y sólida, he compilado todas las soluciones posibles que pude encontrar en una sola esencia. Aquí hay una versión simplificada:

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}

Intento actualizar la esencia con regularidad cada vez que puedo probar en un nuevo dispositivo o versión de Android. Las contribuciones también son bienvenidas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *