Android – Unique ID

Cópia fiel de: http://zarelli.wordpress.com/

Alguns casos temos a necessidade de pegar um Unique ID de um dispositivo, no caso do android temos algumas maneiras porem nenhuma delas garante 100% da integridade desta numeração que se diz “Unica”.

Segue alguns exemplos:
1 – IMEI: Somente para dispositivos que possuem o recurso de telefone.

/** Requer permissão: "android.permission.READ_PHONE_STATE"
 *
 * @param activity
 * @return
 */
public static String getImei(Activity activity)
{
    TelephonyManager tManager = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);
    String numImei = tManager.getDeviceId();
    return numImei;
}

2 – Pseudo-Unique ID: Este código todos os dispositivos que possuem android tem, nele você pega vários tipos de informações como versão da ROM, nome fabricante, tipo de CPU, e detalhes de hardware. Para pegar essas informações é utilizado a classe “android.os.Build” abaixo segue um exemplo para transformar em um Unique ID, você pode implementar essas informações como desejar, a classe Build contém varias informações.

/**Não requer permissão.
  *
  * @param activity
  * @return
  */
public static String getDeviceID(Activity activity)
{
     String numDevIDShort = "35" + //utiliza os primeiros digitos de um IMEI valido.
             Build.BOARD.length() % 10 + Build.BRAND.length() % 10
             + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10
             + Build.DISPLAY.length() % 10 + Build.HOST.length() % 10
             + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10
             + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10
             + Build.TAGS.length() % 10 + Build.TYPE.length() % 10
             + Build.USER.length() % 10; //13 digits
     return numDevIDShort;
 }

3 – Android ID: É considerado pouco confiável, em caso de reset de fabrica “Talvez” ele possa mudar, Essa String também pode ser alterada em caso de telefones roteados.

/**Não requer permissão
 *
 * @param activity
 * @return
 */
public static String getAndroidID(Activity activity)
{
    String numAndroidID = Secure.getString(activity.getContentResolver(), Secure.ANDROID_ID);
    return numAndroidID;
}

4 – Endereço MAC da WLAN: Esse é um identificador único e exclusivo, realizei alguns testes e verifiquei que se a WLAN estiver desativada as vezes retorna como null. Mas podemos considerar como um Unique ID porém é muito comum pessoas clonarem um MAC.

/** Requer permissão: "android.permission.ACCESS_WIFI_STATE"
 *
 * @param activity
 * @return
 */
public static String getWLAN_MAC(Activity activity)
{
    WifiManager wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
    String numWLANMAC = wm.getConnectionInfo().getMacAddress();
    return numWLANMAC;
}

5 – Endereço MAC do Bluetooth: Segue a mesma descrição do item acima porem o mac é do dispositivo bluetooth não do WLAN.

/** Requer permissão: android.permission.BLUETOOTH
 *
 * @param activity
 * @return
 */
public static String getBTMAC(Activity activity)
{
    BluetoothAdapter bluetoothAdapter = null; // Local Bluetooth adapter
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    String numBTMAC = bluetoothAdapter.getAddress();
    return numBTMAC;
}

Essas são algumas maneiras de você “TENTAR” identificar seu dispositivo, com esses recursos é possível criar uma chave criptografada MD5 entre muitas outras coisas, abaixo segue um exemplo de como gerar um unique id a partir das informações anteriores, este exemplo foi retirado da onde eu pegueis as tais informações acima.

/**
 *
 * @param activity
 * @return
 * @throws NoSuchAlgorithmException
 */
public static String getUniqueEncodeID(Activity activity) throwsNoSuchAlgorithmException {

    String numLongID = getImei(activity) + getDeviceID(activity) + getAndroidID(activity) + getWLAN_MAC(activity) + getBTMAC(activity);
    // compute md5
    MessageDigest m = null;

    m = MessageDigest.getInstance("MD5");

    m.update(numLongID.getBytes(), 0, numLongID.length());
    // get md5 bytes
    byte p_md5Data[] = m.digest();
    // create a hex string
    String numLongID = new String();
    for (int i = 0; i < p_md5Data.length; i++) {
        int b = (0xFF & p_md5Data[i]);
        // if it is a single digit, make sure it have 0 in front (proper padding)
        if (b <= 0xF) {
            numLongID += "0";
        }
        // add number to string
        numLongID += Integer.toHexString(b);
    }
    // hex string to uppercase
    numLongID = numLongID.toUpperCase();
    return numLongID;
}

Fonte:
http://www.pocketmagic.net/?p=1662
http://1.bp.blogspot.com/_hFQXQotqCt8/S6otKUxrtII/AAAAAAAAAGI/ExOsNBk_66A/s800/01-android2.jpg

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s