Você está falando sobre recuperar um endereço de e-mail de contatos?
Austyn Mahoney
1
Não, o endereço de e-mail principal do dispositivo.
precisa saber é o seguinte
Há um ou mais endereços de email associados a um dispositivo Android, certo? Era o que eu queria.
precisa saber é o seguinte
2
@ BrandonO'Rourke Você quer dizer "o endereço de e-mail principal do dispositivo" como o associado ao Android Market? Porque existe uma diferença entre o ID do gmail associado ao Android Market e outros e-mails. Dê uma olhada nesta pergunta stackoverflow.com/questions/10606976/…
Gaurav Agarwal
Respostas:
749
Existem várias maneiras de fazer isso, mostradas abaixo.
Como um aviso amigável, tenha cuidado e seja franco com o usuário ao lidar com dados da conta, perfil e contato. Se você usar indevidamente o endereço de e-mail de um usuário ou outras informações pessoais, coisas ruins podem acontecer.
Você pode usar AccountManager.getAccountsou AccountManager.getAccountsByTypeobter uma lista de todos os nomes de conta no dispositivo. Felizmente, para certos tipos de conta (inclusive com.google), os nomes das contas são endereços de email. Exemplo de snippet abaixo.
No Android 4.0 (Ice Cream Sandwich), você pode obter os endereços de e-mail do usuário acessando seu perfil. O acesso ao perfil do usuário é um pouco pesado, pois requer duas permissões (mais sobre isso abaixo), mas os endereços de email são dados bastante sensíveis, portanto esse é o preço da entrada.
Abaixo está um exemplo completo que usa a CursorLoaderpara recuperar linhas de dados de perfil que contêm endereços de email.
publicclassExampleActivityextendsActivityimplementsLoaderManager.LoaderCallbacks<Cursor>{publicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLoaderManager().initLoader(0,null,this);}@OverridepublicLoader<Cursor> onCreateLoader(int id,Bundle arguments){returnnewCursorLoader(this,// Retrieve data rows for the device user's 'profile' contact.Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,ContactsContract.Contacts.Data.CONTENT_DIRECTORY),ProfileQuery.PROJECTION,// Select only email addresses.ContactsContract.Contacts.Data.MIMETYPE +" = ?",newString[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE},// Show primary email addresses first. Note that there won't be// a primary email address if the user hasn't specified one.ContactsContract.Contacts.Data.IS_PRIMARY +" DESC");}@Overridepublicvoid onLoadFinished(Loader<Cursor> cursorLoader,Cursor cursor){List<String> emails =newArrayList<String>();
cursor.moveToFirst();while(!cursor.isAfterLast()){
emails.add(cursor.getString(ProfileQuery.ADDRESS));// Potentially filter on ProfileQuery.IS_PRIMARY
cursor.moveToNext();}...}@Overridepublicvoid onLoaderReset(Loader<Cursor> cursorLoader){}privateinterfaceProfileQuery{String[] PROJECTION ={ContactsContract.CommonDataKinds.Email.ADDRESS,ContactsContract.CommonDataKinds.Email.IS_PRIMARY,};int ADDRESS =0;int IS_PRIMARY =1;}}
Isso requer as permissões READ_PROFILEe READ_CONTACTS:
Eu tenho uma pergunta semelhante usando seu código, eu sou capaz de obter todos os IDs do Gmail associados ao meu telefone, mas eu quero o principal. Eu encontrei uma solução, à medida que adicionamos mais IDs de e-mail para sincronizar com o telefone, ele fica em uma pilha se estou recebendo a 0ª posição com.google id's, estou recebendo a principal porque entra primeiro e adquire a 0ª posição em uma pilha . Aqui estão alguns códigos Account [] accounts = AccountManager.get (this) .getAccountsByType ("com.google"); String myEmailid = contas [0] .toString (); Log.d ("Meu ID de e-mail que eu quero", myEmailid); Eu sei que não é o caminho correto.
PiyushMishra
59
O método de perfil é muito falho (na minha opinião). Um aplicativo que deseja / precisa do meu e-mail não é muito importante comparado a um aplicativo que deseja ler todos os meus contatos, mas você o fez para que ambos exijam as mesmas permissões. Portanto, como usuário, não sei dizer a diferença entre um aplicativo que lê meu email e um aplicativo que lê meus mais de 500 contatos. Esse é um problema prático muito real, pois o número de aplicativos que abusam de seus contatos está aumentando!
Tom
3
@Muzikant Não é de forma alguma uma declaração oficial, mas é algo que é improvável que mude. Dito isso, a maneira "correta" de acessar os endereços de e-mail de um usuário é o Método B. Isso é mais "oficial" e o fato de estar por trás de algumas permissões pesadas deve indicar a sensibilidade com a qual você deve abordar esses dados.
Roman Nurik
15
Eu concordo com @ Tom sobre isso. Pedir permissão para os dados de todos os contatos no telefone apenas para o Primeiro e o Sobrenome do usuário é ridículo.
tasomaniac
3
O método B não está funcionando para mim no Android 4.4, copiando todo o código de exemplo. cursor.isAfterLast()sempre retorna verdadeiro. Qualquer ideia?
Esta é uma resposta muito útil, eu acho que isso deve ser a opção preferida como primária e-mail geralmente significa a Conta do Google, que por sua vez terá em conjunto com o Google Play
Alex.F
@ Alex.F Isso funciona para versões do Android após / do marshmellow?
Eswar
27
Eu usaria o AccountPicker do Android , introduzido no ICS.
Observe que ele requer o uso de serviços de reprodução e, em alguns casos, será exibida uma caixa de diálogo, indicando que o usuário precisará escolher a conta.
desenvolvedor android
O uso de AccountManager.newChooseAccountIntent () faz o mesmo trabalho e não requer a biblioteca de serviços de reprodução.
Denis
Isso abre uma janela para o usuário para autenticação da conta no contexto da versão mais recente do Android? Se sim, como ignorar isso para um dispositivo com apenas uma conta?
Eswar
14
publicString getUsername(){AccountManager manager =AccountManager.get(this);Account[] accounts = manager.getAccountsByType("com.google");List<String> possibleEmails =newLinkedList<String>();for(Account account : accounts){// TODO: Check possibleEmail against an email regex or treat// account.name as an email address only for certain account.type values.
possibleEmails.add(account.name);}if(!possibleEmails.isEmpty()&& possibleEmails.get(0)!=null){String email = possibleEmails.get(0);String[] parts = email.split("@");if(parts.length >1)return parts[0];}returnnull;}
Observe isso requer android.permission.GET_ACCOUNTS, que definiu como permissão 'perigoso' (requer pedido de tempo de execução): developer.android.com/reference/android/...
SagiLow
@SagiLow Como você lidou com isso? Eu não quero perguntar usuário, para uma outra permissão, apenas para torná-lo preguiçoso para digitar seu endereço de e-mail :)
codebased
1
@ codebased eu não ... não é possível, tanto quanto eu sei.
SagiLow
2
manager.getAccountsByType ("com.google"); não funciona com versões posteriores do Android.
O Android foi bloqueado GET_ACCOUNTSrecentemente, então algumas das respostas não funcionaram para mim. Eu consegui isso trabalhando no Android 7.0 com a ressalva de que seus usuários precisam suportar uma caixa de diálogo de permissão.
Isso não difere de outras respostas e parece que essas não estão funcionando para mim - aparentemente porque nas versões mais recentes do Android isso só retorna contas associadas ao aplicativo e não requer mais permissão.
<usa-permissão android: name = "android.permission.GET_ACCOUNTS" />
Keshav Gera
1
As respostas para obter contas não funcionaram para mim (retornar 0 contas) - e posso confirmar que chamar o código em um botão de retorno de chamada não fez diferença.
csga5000
Este código está funcionando, mas recentemente eu tenho tempo questão portanto, verifique o nosso lado
Keshav Gera
0
Adicione esta única linha no manifesto ( para permissão )
Respostas:
Existem várias maneiras de fazer isso, mostradas abaixo.
Como um aviso amigável, tenha cuidado e seja franco com o usuário ao lidar com dados da conta, perfil e contato. Se você usar indevidamente o endereço de e-mail de um usuário ou outras informações pessoais, coisas ruins podem acontecer.
Método A: Use AccountManager (nível 5 da API)
Você pode usar
AccountManager.getAccounts
ouAccountManager.getAccountsByType
obter uma lista de todos os nomes de conta no dispositivo. Felizmente, para certos tipos de conta (inclusivecom.google
), os nomes das contas são endereços de email. Exemplo de snippet abaixo.Observe que isso requer a
GET_ACCOUNTS
permissão:Mais informações sobre o uso
AccountManager
podem ser encontradas no código de exemplo do Contact Manager no SDK.Método B: Use ContactsContract.Profile (nível de API 14 ou superior)
No Android 4.0 (Ice Cream Sandwich), você pode obter os endereços de e-mail do usuário acessando seu perfil. O acesso ao perfil do usuário é um pouco pesado, pois requer duas permissões (mais sobre isso abaixo), mas os endereços de email são dados bastante sensíveis, portanto esse é o preço da entrada.
Abaixo está um exemplo completo que usa a
CursorLoader
para recuperar linhas de dados de perfil que contêm endereços de email.Isso requer as permissões
READ_PROFILE
eREAD_CONTACTS
:fonte
cursor.isAfterLast()
sempre retorna verdadeiro. Qualquer ideia?Isso pode ser útil para outras pessoas:
Usando o AccountPicker para obter o endereço de e-mail do usuário sem nenhuma permissão global e permitindo que o usuário esteja ciente e autorize ou cancele o processo.
fonte
Eu usaria o AccountPicker do Android , introduzido no ICS.
E aguarde o resultado:
fonte
fonte
android.permission.GET_ACCOUNTS
, que definiu como permissão 'perigoso' (requer pedido de tempo de execução): developer.android.com/reference/android/...Existe uma API do Android que permite ao usuário selecionar seu endereço de e-mail sem a necessidade de permissão. Dê uma olhada em: https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
Isso mostrará um seletor onde o usuário pode selecionar um endereço de email. O resultado será entregue em
onActivityResult()
fonte
Infelizmente, a resposta aceita não está funcionando.
Estou atrasado, mas aqui está a solução para o aplicativo Android Email interno, a menos que a URL do conteúdo seja alterada pelo provedor:
fonte
Essa é a coisa mais complicada a se fazer no Android e ainda não o fiz. Mas talvez esses links possam ajudá-lo:
fonte
Use este método:
Observe que isso requer a
GET_ACCOUNTS
permissão:Então:
fonte
As respostas sugeridas não funcionarão mais, pois há uma nova restrição imposta a partir do Android 8 em diante.
mais informações aqui: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
fonte
O Android foi bloqueado
GET_ACCOUNTS
recentemente, então algumas das respostas não funcionaram para mim. Eu consegui isso trabalhando no Android 7.0 com a ressalva de que seus usuários precisam suportar uma caixa de diálogo de permissão.AndroidManifest.xml
MainActivity.java
fonte
Trabalhando no sistema operacional MarshMallow
fonte
Adicione esta única linha no manifesto ( para permissão )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Em seguida, cole esse código em sua atividade
fonte