спасибо за помощь, как я могу показать все имена в ListView? (чтобы я мог видеть все имена контактов на моем телефоне в других окнах)? спасибо
fsdf fsd
4
По какой-то причине этот код получает каждый контакт дважды. Вы случайно не знаете почему?
Эндрю Но
1
@Aerrow иногда получает несколько контактов дважды. Вы решаете эту проблему?
Suman
3
не забудьте закрыть курсор!
MikeL 03
14
НЕ используйте этот код. Он запрашивает все контакты, а затем выполняет дополнительный запрос для каждого отдельного контакта. Ужасная производительность - запуск на реальном устройстве может занять более 10 секунд.
Василий
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;}}
Хорошее использование CursorLoader. Вы знаете, как получить телефонные номера из каждого из этих контактов в CursorLoader?
Felker
1
Вы можете реализовать LoaderManager.LoaderCallbacks <Contact> вместо LoaderManager.LoaderCallbacks <Cursor>. Где «Контакт» - это ваша настраиваемая сущность.
Артем
1
@Artyom Не могли бы вы немного объяснить, как получить часть номера телефона?
hushed_voice
15
Получите информацию о контактах, фото контактов, фото URI и конвертируйте в модель класса
Отличная функция, просто нужно добавить еще одну строку, чтобы закрыть курсор после завершения первого предложения while. Большое спасибо
Tram Nguyen
1
хранение всего растрового изображения может быть плохой идеей, например, вы загружаете 1000 растровых изображений, а пользователь видит только первые 10.
Хитеш Саху
4
Улучшение ответа @Adiii - он очистит номер телефона и удалит все дубликаты
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();}
Помните, что в приведенном выше примере ключ - это номер телефона, а значение - это имя, поэтому прочитайте свое содержимое, например, 998xxxxx282-> Mahatma Gandhi вместо Mahatma Gandhi-> 998xxxxx282
Большое спасибо, я попробую, если у меня будут дополнительные вопросы, я задам вам
fsdf fsd
спасибо за помощь, как я могу показать все имена в ListView? (чтобы я мог видеть все имена контактов на моем телефоне в других окнах)? спасибо
fsdf fsd
6
Это неверный ответ. PhoneLookup.NUMBERне столбец ContactsContract.Contacts.CONTENT_URI, numberFieldColumnIndexвсегда возвращается -1.
cprcrack
2
Должно получиться так: 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, пожалуйста, напишите новый ответ, если вы уверены, что этот ответ, включая ваше редактирование, будет работать.
Bö macht Blau
2
Это метод получения имени и номера списка контактов
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();}}}}}}
Ответы:
Попробуйте это тоже
Если вам нужно больше ссылок, обратитесь к этой ссылке Прочтите список контактов
источник
и не забудь
источник
Получите информацию о контактах, фото контактов, фото URI и конвертируйте в модель класса
1). Пример для модели класса:
2). получить контакты и преобразовать в модель
источник
Улучшение ответа @Adiii - он очистит номер телефона и удалит все дубликаты
Объявить глобальную переменную
Затем используйте функцию ниже
Помните, что в приведенном выше примере ключ - это номер телефона, а значение - это имя, поэтому прочитайте свое содержимое, например, 998xxxxx282-> Mahatma Gandhi вместо Mahatma Gandhi-> 998xxxxx282
источник
Результатом будет массив контактов NameFromContacts. Также убедитесь, что вы добавили
в main.xml
источник
PhoneLookup.NUMBER
не столбецContactsContract.Contacts.CONTENT_URI
,numberFieldColumnIndex
всегда возвращается-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();
Это метод получения имени и номера списка контактов
источник
источник
получить все контакты менее чем за секунду и без какой-либо нагрузки в вашей деятельности - следуйте моим шагам, работает как шарм.
Контакты
Преимущества
источник