Os dispositivos Android têm um ID exclusivo? Em caso afirmativo, qual é uma maneira simples de acessá-lo usando Java?
android
uniqueidentifier
Tyler
fonte
fonte
ANDROID_ID
leia esta resposta e este bug .Respostas:
Settings.Secure#ANDROID_ID
retorna o ID do Android como exclusivo para cada sequência hexadecimal de 64 bits do usuário .fonte
ATUALIZAÇÃO : Nas versões recentes do Android, muitos dos problemas
ANDROID_ID
foram resolvidos e acredito que essa abordagem não é mais necessária. Por favor, dê uma olhada na resposta de Anthony .Divulgação completa: meu aplicativo usou a abordagem abaixo originalmente, mas não a usa mais, e agora usamos a abordagem descrita na entrada do Blog do desenvolvedor do Android à qual a resposta do empacotamento está vinculada (a saber, gerar e salvar a
UUID#randomUUID()
).Existem muitas respostas para essa pergunta, a maioria das quais só funciona "algumas" vezes e, infelizmente, isso não é bom o suficiente.
Com base nos meus testes de dispositivos (todos os telefones, pelo menos um dos quais não está ativado):
TelephonyManager.getDeviceId()
TelephonyManager.getSimSerialNumber()
getSimSerialNumber()
(conforme o esperado)ANDROID_ID
ANDROID_ID
eTelephonyManager.getDeviceId()
- desde que uma conta do Google tenha sido adicionada durante a instalação.Portanto, se você deseja algo único para o próprio dispositivo,
TM.getDeviceId()
deve ser suficiente. Obviamente, alguns usuários são mais paranóicos que outros, portanto, pode ser útil usar o hash 1 ou mais desses identificadores, para que a string ainda seja praticamente exclusiva do dispositivo, mas não identifique explicitamente o dispositivo real do usuário. Por exemplo, usandoString.hashCode()
, combinado com um UUID:pode resultar em algo como:
00000000-54b3-e7c7-0000-000046bffd97
Funciona bem o suficiente para mim.
Como Richard menciona abaixo, não esqueça que você precisa de permissão para ler as
TelephonyManager
propriedades, então adicione isso ao seu manifesto:libs de importação
fonte
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
ao arquivo de manifesto. Se estiver armazenando em um banco de dados, a sequência retornada terá 36 caracteres.Última atualização: 2/6/15
Depois de ler todas as postagens do Stack Overflow sobre a criação de um ID exclusivo, o blog do desenvolvedor do Google e a documentação do Android, sinto como se o 'Pseudo ID' fosse a melhor opção possível.
Problema principal: Hardware vs Software
Hardware
Programas
Repartição geral com Android
- Garantir exclusividade (incluir dispositivos raiz) para API> = 9/10 (99,5% dos dispositivos Android)
- Sem permissões extras
Código Psuedo:
Agradecemos a @stansult por postar todas as nossas opções (nesta questão do Stack Overflow).
Lista de opções - razões pelas quais / por que não usá-las:
E-mail do usuário - Software
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
ou<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
( Como obter o endereço de e-mail principal do dispositivo Android )Número de telefone do usuário - Software
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
IMEI - Hardware (apenas telefones, necessidades
android.permission.READ_PHONE_STATE
)<uses-permission android:name="android.permission.READ_PHONE_STATE" />
ID do Android - Hardware (pode ser nulo, pode ser alterado após a redefinição de fábrica, pode ser alterado em um dispositivo raiz)
Endereço MAC da WLAN - Hardware (necessário
android.permission.ACCESS_WIFI_STATE
)<uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
Endereço MAC Bluetooth - Hardware (dispositivos com Bluetooth, necessidades
android.permission.BLUETOOTH
)<uses-permission android:name="android.permission.BLUETOOTH "/>
ID pseudo-exclusivo - software (para todos os dispositivos Android)
Sei que não existe uma maneira 'perfeita' de obter um ID exclusivo sem usar permissões; no entanto, às vezes precisamos apenas rastrear a instalação do dispositivo. Quando se trata de criar um ID exclusivo, podemos criar um 'pseudo id exclusivo' com base apenas nas informações que a API do Android nos fornece sem o uso de permissões extras. Dessa forma, podemos mostrar respeito ao usuário e tentar oferecer uma boa experiência ao usuário também.
Com um ID pseudo-exclusivo, você realmente só descobre que pode haver duplicatas com base no fato de que existem dispositivos semelhantes. Você pode ajustar o método combinado para torná-lo mais exclusivo; no entanto, alguns desenvolvedores precisam rastrear instalações de dispositivos e isso fará o truque ou o desempenho com base em dispositivos semelhantes.
API> = 9:
Se o dispositivo Android for API 9 ou superior, é garantido que ele seja único devido ao campo 'Build.SERIAL'.
Lembre-se , tecnicamente, você está perdendo apenas cerca de 0,5% dos usuários que têm API <9 . Então você pode se concentrar no resto: são 99,5% dos usuários!
API <9:
Se o dispositivo Android do usuário for menor que a API 9; esperançosamente, eles não fizeram uma redefinição de fábrica e seu 'Secure.ANDROID_ID' será preservado ou não será 'nulo'. (consulte http://developer.android.com/about/dashboards/index.html )
Se todo o resto falhar:
Se tudo mais falhar, se o usuário tiver uma API menor que a API 9 (menor que Gingerbread), redefinir o dispositivo ou 'Secure.ANDROID_ID' retornar 'nulo', simplesmente o ID retornado será baseado apenas nas informações do dispositivo Android. É aqui que as colisões podem acontecer.
Alterar:
Por favor, dê uma olhada no método abaixo:
Novo (para aplicativos com anúncios E Google Play Services):
No console do desenvolvedor do Google Play:
Implementação :
Permissão:
Código:
Origem / Documentos:
http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html
Importante:
Aviso, os usuários podem redefinir:
http://en.kioskea.net/faq/34732-android-reset-your-advertising-id
Eu tentei fazer referência a todos os links dos quais tirei informações. Se você está faltando e precisa ser incluído, comente!
ID da Instância dos Serviços do Google Player
https://developers.google.com/instance-id/
fonte
Build
classe não mudaria com a atualização do sistema operacional? Especialmente se a API foi atualizada? Se sim, como você garante que isso seja único? (Falando sobre o método que você escreveu)Como Dave Webb menciona, o Android Developer Blog possui um artigo que aborda isso. Sua solução preferida é rastrear instalações de aplicativos em vez de dispositivos, e isso funcionará bem na maioria dos casos de uso. A postagem do blog mostrará o código necessário para fazer esse trabalho, e eu recomendo que você verifique.
No entanto, a postagem do blog continua discutindo soluções se você precisar de um identificador de dispositivo em vez de um identificador de instalação de aplicativo. Conversei com alguém no Google para obter esclarecimentos adicionais sobre alguns itens, caso você precise fazer isso. Aqui está o que eu descobri sobre identificadores de dispositivo que NÃO são mencionados na postagem de blog acima mencionada:
Com base nas recomendações do Google, implementei uma classe que geraria um UUID exclusivo para cada dispositivo, usando ANDROID_ID como a semente, quando apropriado, recorrendo ao TelephonyManager.getDeviceId () conforme necessário e, se isso falhar, recorrendo a um UUID exclusivo gerado aleatoriamente que persiste nas reinicializações do aplicativo (mas não nas reinstalações do aplicativo).
Note-se que para os dispositivos que têm de fallback na ID do dispositivo, a identificação única VAI persistem em redefinições de fábrica. Isso é algo para estar ciente. Se você precisar garantir que uma redefinição de fábrica redefina seu ID exclusivo, considere voltar diretamente ao UUID aleatório em vez do ID do dispositivo.
Novamente, esse código é para um ID de dispositivo, não para um ID de instalação de aplicativo. Na maioria das situações, provavelmente é o que você está procurando um ID de instalação do aplicativo. Mas se você precisar de um ID de dispositivo, o código a seguir provavelmente funcionará para você.
fonte
Aqui está o código que Reto Meier usou na apresentação de E / S do Google este ano para obter um ID exclusivo para o usuário:
Se você associar isso a uma estratégia de backup para enviar preferências para a nuvem (também descrita na palestra de Reto , você deve ter um ID vinculado a um usuário e permanecer após o dispositivo ser limpo ou até substituído. Pretendo usar isso nas análises daqui para frente (em outras palavras, ainda não fiz isso :):
fonte
Além disso, você pode considerar o endereço MAC do adaptador Wi-Fi. Recuperado assim:
Requer permissão
android.permission.ACCESS_WIFI_STATE
no manifesto.É relatado que está disponível mesmo quando o Wi-Fi não está conectado. Se Joe, da resposta acima, tentar este em seus vários dispositivos, seria ótimo.
Em alguns dispositivos, ele não está disponível quando o Wi-Fi está desativado.
NOTA: No Android 6.x, ele retorna um endereço mac falso consistente:
02:00:00:00:00:00
fonte
android.permission.ACCESS_WIFI_STATE
02:00:00:00:00:00
Há informações bastante úteis aqui .
Abrange cinco tipos diferentes de ID:
android.permission.READ_PHONE_STATE
)android.permission.ACCESS_WIFI_STATE
)android.permission.BLUETOOTH
)fonte
O Blog oficial do Android Developers agora tem um artigo completo sobre esse assunto, Identificando instalações de aplicativos .
fonte
No Google I / O Reto Meier lançou uma resposta robusta sobre como abordar isso, que deve atender às necessidades da maioria dos desenvolvedores para rastrear os usuários nas instalações. Anthony Nolan mostra a direção em sua resposta, mas pensei em escrever a abordagem completa para que outros possam ver facilmente como fazer isso (demorei um pouco para descobrir os detalhes).
Essa abordagem fornecerá um ID de usuário seguro e anônimo, que será persistente para o usuário em diferentes dispositivos (com base na conta principal do Google) e em instalações. A abordagem básica é gerar um ID de usuário aleatório e armazená-lo nas preferências compartilhadas dos aplicativos. Em seguida, você usa o agente de backup do Google para armazenar as preferências compartilhadas vinculadas à conta do Google na nuvem.
Vamos passar pela abordagem completa. Primeiro, precisamos criar um backup para nossas SharedPreferences usando o Serviço de Backup do Android. Comece registrando seu aplicativo via
http://developer.android.com/google/backup/signup.html
.O Google fornecerá uma chave de serviço de backup que você precisará adicionar ao manifesto. Você também precisa informar ao aplicativo para usar o BackupAgent da seguinte maneira:
Em seguida, você precisa criar o agente de backup e solicitar que ele use o agente auxiliar para preferências compartilhadas:
Para concluir o backup, você precisa criar uma instância do BackupManager em sua Atividade principal:
Por fim, crie um ID do usuário, se ele ainda não existir, e armazene-o nas SharedPreferences:
Este User_ID agora será persistente nas instalações, mesmo se o usuário mover o dispositivo.
Para mais informações sobre essa abordagem, consulte a palestra de Reto .
E para obter detalhes completos de como implementar o agente de backup, consulte Backup de dados . Eu particularmente recomendo a seção na parte inferior do teste, pois o backup não ocorre instantaneamente e, para testar, você precisa forçar o backup.
fonte
Eu acho que essa é a maneira certa de construir um esqueleto para uma identificação única ... confira.
ID pseudo-exclusivo, que funciona em todos os dispositivos Android Alguns dispositivos não têm telefone (por exemplo, tablets) ou, por algum motivo, não deseja incluir a permissão READ_PHONE_STATE. Ainda é possível ler detalhes como versão da ROM, nome do fabricante, tipo de CPU e outros detalhes de hardware, que serão adequados se você desejar usar o ID para uma verificação de chave serial ou outros propósitos gerais. O ID calculado dessa maneira não será exclusivo: é possível encontrar dois dispositivos com o mesmo ID (com base no mesmo hardware e na imagem da ROM), mas as alterações nos aplicativos do mundo real são desprezíveis. Para esse fim, você pode usar a classe Build:
A maioria dos membros do Build são strings, o que estamos fazendo aqui é medir o comprimento e transformá-lo via módulo em um dígito. Temos 13 dígitos e estamos adicionando mais dois na frente (35) para ter o mesmo tamanho de ID que o IMEI (15 dígitos). Existem outras possibilidades aqui estão bem, basta dar uma olhada nessas seqüências de caracteres. Retorna algo como
355715565309247
. Nenhuma permissão especial é necessária, tornando essa abordagem muito conveniente.(Informação extra: A técnica fornecida acima foi copiada de um artigo no Pocket Magic .)
fonte
O código a seguir retorna o número de série do dispositivo usando uma API Android oculta. Mas, esse código não funciona no Samsung Galaxy Tab porque "ro.serialno" não está definido neste dispositivo.
fonte
ro.serialno
é usado para gerar o arquivoSettings.Secure.ANDROID_ID
. Portanto, são basicamente representações diferentes do mesmo valor.ANDROID_ID
é derivado dele.android.os.Build.SERIAL
android.os.Build.SERIAL
será descontinuado no Android O, consulte android-developers.googleblog.com/2017/04/…É uma pergunta simples, sem resposta simples.
Além disso, todas as respostas existentes aqui são desatualizadas ou não confiáveis.
Portanto, se você estiver procurando uma solução em 2020 .
Aqui estão algumas coisas a ter em mente:
Todos os identificadores baseados em hardware (SSAID, IMEI, MAC etc.) não são confiáveis para dispositivos que não são do Google (Tudo, exceto Pixels e Nexuses), que são mais de 50% dos dispositivos ativos em todo o mundo. Portanto, as práticas recomendadas para identificadores oficiais do Android declaram claramente:
Isso torna a maioria das respostas acima inválidas. Também devido a diferentes atualizações de segurança do Android, algumas delas exigem permissões de tempo de execução mais novas e mais rigorosas, que podem ser simplesmente negadas pelo usuário.
Como exemplo
CVE-2018-9489
que afeta todas as técnicas baseadas em WIFI mencionadas acima.Isso torna esses identificadores não apenas não confiáveis, mas também inacessíveis em muitos casos.
Então, em palavras mais simples: não use essas técnicas .
Muitas outras respostas aqui estão sugerindo o uso de
AdvertisingIdClient
, o que também é incompatível, pois seu design deve ser usado apenas para criação de perfil de anúncios. Também é indicado na referência oficialNão é apenas confiável para a identificação do dispositivo, mas você também deve seguir a privacidade do usuário em relação ao rastreamento de anúncios política de , que afirma claramente que o usuário pode redefini-lo ou bloqueá-lo a qualquer momento.
Portanto, também não use .
Como você não pode ter o identificador de dispositivo estático e exclusivo globalmente estático desejado. A referência oficial do Android sugere:
É exclusivo para a instalação do aplicativo no dispositivo; portanto, quando o usuário desinstala o aplicativo, ele é eliminado e, portanto, não é 100% confiável, mas é a próxima melhor coisa.
Para usar,
FirebaseInstanceId
adicione a dependência mais recente de mensagens do firebase ao seu gradleE use o código abaixo em um thread de segundo plano:
Se você precisar armazenar a identificação do dispositivo no servidor remoto, não a armazene como está (texto sem formatação), mas com um hash com sal .
Hoje, não é apenas uma prática recomendada, você deve fazê-lo por lei, de acordo com o GDPR - identificadores e regulamentos semelhantes.
fonte
Usando o código abaixo, você pode obter o ID exclusivo de um dispositivo Android OS como uma string.
fonte
Um campo Serial foi adicionado ao
Build
classe no nível 9 da API (Android 2.3 - Gingerbread). A documentação diz que representa o número de série do hardware. Portanto, deve ser exclusivo, se existir no dispositivo.Não sei se ele é realmente suportado (= não nulo) por todos os dispositivos com nível de API> = 9.
fonte
Uma coisa que vou acrescentar - eu tenho uma dessas situações únicas.
Usando:
Acontece que, embora meu Viewsonic G Tablet reporte um DeviceID que não seja Nulo, cada G Tablet reporta o mesmo número.
Torna interessante jogar "Pocket Empires", que fornece acesso instantâneo à conta de alguém com base no DeviceID "único".
Meu dispositivo não possui um rádio celular.
fonte
9774d56d682e549c
?Para obter instruções detalhadas sobre como obter um identificador exclusivo para cada dispositivo Android do qual seu aplicativo está instalado, consulte o Blog oficial do Android Developers, postando a identificação de instalações de aplicativos .
Parece que a melhor maneira é você gerar um você mesmo durante a instalação e depois lê-lo quando o aplicativo for reiniciado.
Pessoalmente, acho isso aceitável, mas não ideal. Nenhum identificador fornecido pelo Android funciona em todas as instâncias, pois a maioria depende dos estados de rádio do telefone (Wi-Fi ativado / desativado, celular ativado / desativado, Bluetooth ativado / desativado). Os outros, como
Settings.Secure.ANDROID_ID
devem ser implementados pelo fabricante e não têm garantia de serem exclusivos.A seguir, é apresentado um exemplo de gravação de dados em um arquivo de instalação que seria armazenado juntamente com outros dados que o aplicativo salva localmente.
fonte
Adicione código abaixo no arquivo de classe:
Adicione AndroidManifest.xml:
fonte
O ID exclusivo de um dispositivo Android OS como String, usando
TelephonyManager
eANDROID_ID
, é obtido por:Mas recomendo fortemente um método sugerido pelo Google, consulte Identificando instalações de aplicativos .
fonte
Existem várias abordagens diferentes para solucionar esses
ANDROID_ID
problemas (null
às vezes, ou dispositivos de um modelo específico sempre retornam o mesmo ID) com prós e contras:Eu próprio prefiro usar uma implementação OpenUDID existente (consulte https://github.com/ylechelle/OpenUDID ) para Android (consulte https://github.com/vieux/OpenUDID ). É fácil de integrar e utiliza o
ANDROID_ID
recurso com fallbacks para os problemas mencionados acima.fonte
E o IMEI ? Isso é exclusivo para Android ou outros dispositivos móveis.
fonte
Aqui está como eu estou gerando o ID exclusivo:
fonte
Meus dois centavos - NB, isto é para um ID exclusivo de dispositivo (err) - não para a instalação, conforme discutido no blog dos desenvolvedores do Android .
Observe que a solução fornecida pelo @emmby recai em um ID por aplicativo, pois as SharedPreferences não são sincronizadas entre os processos (veja aqui e aqui ). Então eu evitei isso completamente.
Em vez disso, encapsulei as várias estratégias para obter um ID (dispositivo) em uma enumeração - alterar a ordem das constantes da enumeração afeta a prioridade das várias maneiras de obter a identificação. O primeiro ID não nulo é retornado ou uma exceção é lançada (conforme as boas práticas Java de não dar um significado nulo). Por exemplo, eu tenho o TELEPHONY primeiro - mas uma boa opção padrão seria a versão beta do ANDROID_ID :
fonte
Existem mais de 30 respostas aqui e algumas são iguais e outras são únicas. Esta resposta é baseada em algumas dessas respostas. Um deles é a resposta de @Lenn Dolling.
Ele combina três IDs e cria uma cadeia hexadecimal de 32 dígitos. Funcionou muito bem para mim.
3 IDs são:
Pseudo-ID - É gerado com base nas especificações físicas do dispositivo
ANDROID_ID -
Settings.Secure.ANDROID_ID
Endereço Bluetooth - Endereço do adaptador Bluetooth
Ele retornará algo como isto: 551F27C060712A72730B0A0F734064B1
Nota: Você sempre pode adicionar mais IDs à
longId
sequência. Por exemplo, número de série. endereço do adaptador wifi. IMEI. Dessa forma, você o torna mais exclusivo por dispositivo.fonte
longId
e armazená-lo em um arquivo, irá torná-lo o identificador mais exclusivo:String uuid = UUID.randomUUID().toString();
longId
. Altere essa linha como esta:String longId = pseudoId + androidId + btId + UUID.randomUUID().toString();
Isso garante que o ID gerado seja exclusivo.Outra maneira é usar
/sys/class/android_usb/android0/iSerial
em um aplicativo sem nenhuma permissão.Para fazer isso em Java, basta usar um FileInputStream para abrir o arquivo iSerial e ler os caracteres. Apenas certifique-se de envolvê-lo em um manipulador de exceções, porque nem todos os dispositivos possuem esse arquivo.
Sabe-se que pelo menos os seguintes dispositivos têm esse arquivo legível por todo o mundo:
Você também pode ver minha postagem no blog Vazando o número de série do hardware Android para aplicativos não privilegiados, onde discuto quais outros arquivos estão disponíveis para obter informações.
fonte
TelephonyManger.getDeviceId () Retorna o ID do dispositivo exclusivo, por exemplo, o IMEI para GSM e o MEID ou ESN para telefones CDMA.
Mas eu recomendo usar:
Settings.Secure.ANDROID_ID que retorna o ID do Android como uma sequência hexadecimal exclusiva de 64 bits.
Às vezes, TelephonyManger.getDeviceId () retornará nulo; portanto, para garantir um ID exclusivo, você utilizará este método:
fonte
Para reconhecimento de hardware de um dispositivo Android específico, você pode verificar os endereços MAC.
você pode fazer assim:
no AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
agora no seu código:
Em todos os dispositivos Android, há pelo menos uma interface "wlan0", que é o chip WI-FI. Esse código funciona mesmo quando o WI-FI não está ativado.
PS Existem várias outras interfaces que você obterá na lista que contém o MACS. Mas isso pode mudar entre os telefones.
fonte
Eu uso o código a seguir para obter o
IMEI
ou usar o Secure.ANDROID_ID
Como alternativa, quando o dispositivo não possui recursos de telefone:fonte
Mais especificamente
Settings.Secure.ANDROID_ID
,. Essa é uma quantidade de 64 bits que é gerada e armazenada quando o dispositivo inicializa. É reiniciado quando o dispositivo é limpo.ANDROID_ID
parece uma boa escolha para um identificador de dispositivo exclusivo. Existem desvantagens: primeiro, não é 100% confiável em lançamentos do Android anteriores à 2.2.(“Froyo”).
Além disso, houve pelo menos um bug amplamente observado em um telefone celular popular de um grande fabricante, onde cada instância tem o mesmo ANDROID_ID.fonte
Para entender os códigos únicos disponíveis em dispositivos Android. Use este guia oficial.
Práticas recomendadas para identificadores exclusivos:
IMEI, endereços Mac, ID da instância, GUIDs, SSAID, ID da publicidade, API da Safety Net para verificar dispositivos.
https://developer.android.com/training/articles/user-data-ids
fonte
ID da instância do Google
Lançado em I / O 2015; no Android requer serviços de reprodução 7.5.
https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation
Parece que o Google pretende que esse ID seja usado para identificar instalações no Android, Chrome e iOS.
Ele identifica uma instalação e não um dispositivo, mas novamente ANDROID_ID (que é a resposta aceita) agora também não identifica dispositivos. Com o tempo de execução do ARC, um novo ANDROID_ID é gerado para cada instalação ( detalhes aqui ), assim como esse novo ID de instância. Além disso, acho que identificar instalações (não dispositivos) é o que a maioria de nós está procurando.
As vantagens do ID da instância
Parece-me que o Google pretende que seja usado para esse fim (identificando suas instalações), seja multiplataforma e possa ser usado para vários outros fins (veja os links acima).
Se você usar o GCM, eventualmente precisará usar esse ID da instância, pois é necessário para obter o token do GCM (que substitui o antigo ID de registro do GCM).
As desvantagens / questões
Na implementação atual (GPS 7.5), o ID da instância é recuperado de um servidor quando seu aplicativo solicita. Isso significa que a chamada acima é uma chamada de bloqueio - nos meus testes não científicos, leva 1-3 segundos se o dispositivo estiver online e 0,5 - 1,0 segundos se estiver off-line (presumivelmente esse é o tempo que espera antes de desistir e gerar um ID aleatório). Isso foi testado na América do Norte no Nexus 5 com Android 5.1.1 e GPS 7.5.
Se você usar o ID para os fins que eles pretendem - por exemplo. autenticação de aplicativo, identificação de aplicativo, GCM - acho que esses 1-3 segundos podem ser um incômodo (dependendo do seu aplicativo, é claro).
fonte