Como posso obter o UUID do meu telefone Android em uma aplicação?

Estou à procura de Ajuda para obter o UUID do meu telemóvel Android. Procurei na rede e encontrei uma solução em potencial, mas não está funcionando no emulador.

Aqui está o código:

Class<?> c;
try {
    c = Class.forName("android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
    Log.d("ANDROID UUID",serial);
} catch (Exception e) {
    e.printStackTrace();
}
Alguém sabe porque não está a funcionar ou tem uma solução melhor?

Author: Cody Gray, 2011-02-23

7 answers

Isto funciona comigo.
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String uuid = tManager.getDeviceId();

Editar:

Você também precisa android.permission.READ_PHONE_STATE definido no seu manifesto. Desde o Android M, você precisa pedir Esta permissão em tempo de execução.

Veja este anwser: https://stackoverflow.com/a/38782876/1339179

 61
Author: pedr0, 2017-05-23 12:34:19

Como Dave Webb menciona, o Blog de desenvolvimento do Android tem um artigo que cobre isto. Sua solução preferida é rastrear instalações de aplicativos em vez de dispositivos, e isso vai funcionar bem para a maioria dos casos de uso. O post do blog irá mostrar-lhe o código necessário para fazer com que isso funcione, e eu recomendo que você verifique isso para fora.

No entanto, o post do blog continua a discutir soluções se você precisa de um identificador de dispositivo em vez de um identificador de instalação app. Falei com alguém no Google para obter alguns esclarecimentos adicionais sobre alguns itens no caso de que você precisa fazer isso. Eis o que descobri sobre identificadores de dispositivos que não são mencionados no post mencionado:

  • O ANDROID_ID é o identificador preferido do dispositivo. ANDROID_ID é perfeitamente confiável em versões do Android = 2.3. Apenas 2.2 tem os problemas mencionados no post.
  • vários dispositivos de vários fabricantes são afectados pelo erro ANDROID_ID no ponto 2.2.
  • Até onde eu cheguei foi capaz de determinar, todos os dispositivos afetados têm o mesmo ANDROID_ID, que é 9774d56d682e549c. Que também é o mesmo ID do dispositivo relatado pelo emulador, btw.
  • o Google acredita que os OEMs ter corrigido o problema, para muitos ou a maioria dos seus dispositivos, mas não foi capaz de verificar que a partir do início de abril de 2011, pelo menos, ainda é muito fácil encontrar dispositivos que tenham quebrado ANDROID_ID.
  • Quando um dispositivo tem vários utilizadores (disponível em dispositivos rodando Android 4.2 ou superior) , cada usuário aparece como um dispositivo completamente separado, então o valor ANDROID_ID é único para cada usuário.

Com base nas recomendações do Google, implementei uma classe que irá gerar um UUID único para cada dispositivo, usando ANDROID_ID como a semente, se for caso disso, caindo de volta no Telefonymanager.getDeviceId () conforme necessário, e se isso falhar, recorrendo a um UUID único gerado aleatoriamente que é persistido nos reiniciamentos do app (mas não na aplicação) reinstalações).

Note - se que para os dispositivos que têm de recuar no ID do dispositivo, o ID único irá persistir através de reinstalações de fábrica. Isto é algo a ter em conta. Se você precisar garantir que um reset de fábrica irá reiniciar o seu ID único, você pode querer considerar voltar diretamente para o UUID Aleatório em vez do ID do dispositivo.

Novamente, este código é para um ID de dispositivo, não um ID de instalação de app. Para a maioria das situações, um ID de instalação app é provavelmente o que você é buscar. Mas se você precisa de um ID de dispositivo, então o seguinte código provavelmente funcionará para você.

import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

public class DeviceUuidFactory {
    protected static final String PREFS_FILE = "device_id.xml";
    protected static final String PREFS_DEVICE_ID = "device_id";

    protected static UUID uuid;



    public DeviceUuidFactory(Context context) {

        if( uuid ==null ) {
            synchronized (DeviceUuidFactory.class) {
                if( uuid == null) {
                    final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null );

                    if (id != null) {
                        // Use the ids previously computed and stored in the prefs file
                        uuid = UUID.fromString(id);

                    } else {

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

                        // Use the Android ID unless it's broken, in which case fallback on deviceId,
                        // unless it's not available, then fallback on a random number which we store
                        // to a prefs file
                        try {
                            if (!"9774d56d682e549c".equals(androidId)) {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
                            } else {
                                final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
                                uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
                            }
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }

                        // Write the value out to the prefs file
                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit();

                    }

                }
            }
        }

    }


    /**
     * Returns a unique UUID for the current android device.  As with all UUIDs, this unique ID is "very highly likely"
     * to be unique across all Android devices.  Much more so than ANDROID_ID is.
     *
     * The UUID is generated by using ANDROID_ID as the base key if appropriate, falling back on
     * TelephonyManager.getDeviceID() if ANDROID_ID is known to be incorrect, and finally falling back
     * on a random UUID that's persisted to SharedPreferences if getDeviceID() does not return a
     * usable value.
     *
     * In some rare circumstances, this ID may change.  In particular, if the device is factory reset a new device ID
     * may be generated.  In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2
     * to a newer, non-buggy version of Android, the device ID may change.  Or, if a user uninstalls your app on
     * a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation.
     *
     * Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT
     * change after a factory reset.  Something to be aware of.
     *
     * Works around a bug in Android 2.2 for many devices when using ANDROID_ID directly.
     *
     * @see http://code.google.com/p/android/issues/detail?id=10603
     *
     * @return a UUID that may be used to uniquely identify your device for most purposes.
     */
    public UUID getDeviceUuid() {
        return uuid;
    }
}
 91
Author: emmby, 2014-05-14 07:43:14
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
 8
Author: Anil Bhatiya, 2013-01-25 06:05:43
{[[2]} em vez de obter IMEI de Telefonymanager usar ANDROID_ID.
Settings.Secure.ANDROID_ID
Isto funciona para cada dispositivo android, independentemente de ter telefonia.
 4
Author: porwalankit, 2015-12-23 07:25:27
 1
Author: Gopi cg, 2016-06-02 16:54:53

Adicionar

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

Método

String getUUID(){
    TelephonyManager teleManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String tmSerial = teleManager.getSimSerialNumber();
    String tmDeviceId = teleManager.getDeviceId();
    String androidId = android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    if (tmSerial  == null) tmSerial   = "1";
    if (tmDeviceId== null) tmDeviceId = "1";
    if (androidId == null) androidId  = "1";
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDeviceId.hashCode() << 32) | tmSerial.hashCode());
    String uniqueId = deviceUuid.toString();
    return uniqueId;
}
 1
Author: KongJing, 2016-10-21 16:07:22

A partir da API 26, getDeviceId() está desactualizado. Se precisar de obter o IMEI do dispositivo, utilize o seguinte:

 String deviceId = "";
    if (Build.VERSION.SDK_INT >= 26) {
        deviceId = getSystemService(TelephonyManager.class).getImei();
    }else{
        deviceId = getSystemService(TelephonyManager.class).getDeviceId();
    }
 0
Author: DummyData, 2017-09-07 16:19:33