obrigado pela ajuda, como posso mostrar todos os nomes em um ListView? (que posso ver todos os nomes de contatos no meu telefone em outra janela)? obrigado
fsdf fsd
4
Por algum motivo, esse código obtém cada contato duas vezes. Você sabe por quê?
Andrew No
1
@Aerrow algumas vezes consiga alguns contatos duas vezes. Você resolve esses problemas?
Suman
3
não se esqueça de fechar o cursor!
MikeL
13
NÃO use este código. Ele consulta todos os contatos e, em seguida, executa uma consulta adicional para cada contato. Desempenho terrível - pode levar mais de 10 segundos para ser executado em um dispositivo real.
Vasiliy
15
publicclassMyActivityextendsActivityimplementsLoaderManager.LoaderCallbacks<Cursor>{privatestaticfinalint CONTACTS_LOADER_ID =1;@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);// Prepare the loader. Either re-connect with an existing one,// or start a new one.
getLoaderManager().initLoader(CONTACTS_LOADER_ID,null,this);}@OverridepublicLoader<Cursor> onCreateLoader(int id,Bundle args){// This is called when a new Loader needs to be created.if(id == CONTACTS_LOADER_ID){return contactsLoader();}returnnull;}@Overridepublicvoid onLoadFinished(Loader<Cursor> loader,Cursor cursor){//The framework will take care of closing the// old cursor once we return.List<String> contacts = contactsFromCursor(cursor);}@Overridepublicvoid onLoaderReset(Loader<Cursor> loader){// This is called when the last Cursor provided to onLoadFinished()// above is about to be closed. We need to make sure we are no// longer using it.}privateLoader<Cursor> contactsLoader(){Uri contactsUri =ContactsContract.Contacts.CONTENT_URI;// The content URI of the phone contactsString[] projection ={// The columns to return for each rowContactsContract.Contacts.DISPLAY_NAME
};String selection =null;//Selection criteriaString[] selectionArgs ={};//Selection criteriaString sortOrder =null;//The sort order for the returned rowsreturnnewCursorLoader(
getApplicationContext(),
contactsUri,
projection,
selection,
selectionArgs,
sortOrder);}privateList<String> contactsFromCursor(Cursor cursor){List<String> contacts =newArrayList<String>();if(cursor.getCount()>0){
cursor.moveToFirst();do{String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contacts.add(name);}while(cursor.moveToNext());}return contacts;}}
Bom uso do CursorLoader. Você sabe como obter números de telefone de cada um desses contatos em um CursorLoader?
Felker
1
Você pode implementar LoaderManager.LoaderCallbacks <Contact> em vez de LoaderManager.LoaderCallbacks <Cursor>. Onde 'Contato' é sua entidade personalizada.
Artyom de
1
@Artyom Você pode explicar como obter um pouco a parte do número de telefone?
hushed_voice
15
Obtenha informações de contatos, contatos com fotos, uri de fotos e converta para o modelo de classe
privatevoid getPhoneNumbers(){Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);// Loop Through All The Numberswhile(phones.moveToNext()){String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));// Cleanup the phone number
phoneNumber = phoneNumber.replaceAll("[()\\s-]+","");// Enter Into Hash Map
namePhoneMap.put(phoneNumber, name);}// Get The Contents of Hash Map in Logfor(Map.Entry<String,String> entry : namePhoneMap.entrySet()){String key = entry.getKey();Log.d(TAG,"Phone :"+ key);Stringvalue= entry.getValue();Log.d(TAG,"Name :"+value);}
phones.close();}
Lembre-se que no exemplo acima a chave é o número do telefone e o valor é um nome, então leia o seu conteúdo como 998xxxxx282-> Mahatma Gandhi em vez de Mahatma Gandhi-> 998xxxxx282
muito obrigado, vou tentar, se tiver mais perguntas, vou perguntar a você
fsdf fsd
obrigado pela ajuda, como posso mostrar todos os nomes em um ListView? (que posso ver todos os nomes de contatos no meu telefone em outra janela)? obrigado
fsdf fsd
6
Esta resposta está errada. PhoneLookup.NUMBERnão é uma coluna em ContactsContract.Contacts.CONTENT_URI, numberFieldColumnIndexsempre retornando -1.
cprcrack
2
Deve ser assim: Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); while (phones.moveToNext()) { String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phones.close();
user1510006
1
@gunner_dev, escreva uma nova resposta se tiver certeza de que esta resposta, incluindo sua edição , funcionará.
Bö macht Blau
2
Este é o método para obter o nome e o número da lista de contatos
privatevoid getAllContacts(){ContentResolver contentResolver = getContentResolver();Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME +" ASC");if(cursor.getCount()>0){while(cursor.moveToNext()){int hasPhoneNumber =Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));if(hasPhoneNumber >0){String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",newString[]{id},null);if(phoneCursor !=null){if(phoneCursor.moveToNext()){String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//At here You can add phoneNUmber and Name to you listView ,ModelClass,Recyclerview
phoneCursor.close();}}}}}}
Respostas:
Tente isso também,
Se você precisar de mais referências, consulte este link Leia ContactList
fonte
e não se esqueça
fonte
Obtenha informações de contatos, contatos com fotos, uri de fotos e converta para o modelo de classe
1). Amostra para modelo de classe:
2). obter contatos e converter para modelo
fonte
Melhorando a resposta de @Adiii - Vai limpar o número do telefone e remover todas as duplicatas
Declare uma variável global
Então use a função abaixo
Lembre-se que no exemplo acima a chave é o número do telefone e o valor é um nome, então leia o seu conteúdo como 998xxxxx282-> Mahatma Gandhi em vez de Mahatma Gandhi-> 998xxxxx282
fonte
O resultado será um arrayNomeFromContatos cheio de contatos. Verifique também se você adicionou
em main.xml
fonte
PhoneLookup.NUMBER
não é uma coluna emContactsContract.Contacts.CONTENT_URI
,numberFieldColumnIndex
sempre retornando-1
.Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); while (phones.moveToNext()) { String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phones.close();
Este é o método para obter o nome e o número da lista de contatos
fonte
fonte
obtenha todos os contatos em menos de um segundo e sem qualquer carga em sua atividade - siga meus passos funciona perfeitamente.
Contatos
Benefícios
fonte