如何阅读Android 2.0上的联系人

我正在使用Android 2.0,并试图收到所有联系人列表。

由于android.provider.Contacts.People已被弃用,我不得不使用android.provider.ContactsContract ,但我找不到一个正确的例子,如何使用它(例如:检索电话簿上的所有联系人列表)。

任何人都知道在哪里find这样的例子?

首先,确保你已经添加了

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

到你的AndroidManifest.xml文件,然后你可以像这样循环你的手机通讯录:

 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); while (cursor.moveToNext()) { String contactId = cursor.getString(cursor.getColumnIndex( ContactsContract.Contacts._ID)); String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if (Boolean.parseBoolean(hasPhone)) { // You know it has a number so now query it like this Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); while (phones.moveToNext()) { String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); } phones.close(); } Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); while (emails.moveToNext()) { // This would allow you get several email addresses String emailAddress = emails.getString( emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); } emails.close(); } cursor.close(); 

此外,您可以循环访问您的联系人,只需获取姓名和电话号码即可:

 Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while(people.moveToNext()) { int nameFieldColumnIndex = people.getColumnIndex(PhoneLookup.DISPLAY_NAME); String contact = people.getString(nameFieldColumnIndex); int numberFieldColumnIndex = people.getColumnIndex(PhoneLookup.NUMBER); String number = people.getString(numberFieldColumnIndex); } people.close(); 

此外,如果您需要从联系人中获取笔记等内容,则需要使用不同的URI,如下所示(请随意使用此方法):

 private String getNote(long contactId) { String note = null; String[] columns = new String[] { ContactsContract.CommonDataKinds.Note.NOTE }; String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{Long.toString(contactId), ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; Cursor contacts = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null); if (contacts.moveToFirst()) { rv = contacts.getString(0); } contacts.close(); return note; } 

注意,这次我不仅使用了联系人ID,而且还使用了查询的MIMEtypes。

很高兴看到一些有用的信息,令人沮丧的是这个重要的主题如何被文档等所覆盖。 经过太多的黑客攻击后,我想我也会分享一些代码。 下面的代码有点漂亮,并且可以更高效地完成同样的事情。

 Uri contactUri = ContactsContract.Contacts.CONTENT_URI; String[] PROJECTION = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER, }; String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'"; Cursor contacts = managedQuery(contactUri, PROJECTION, SELECTION, null, null ); 

上面的代码块返回一个Cursor指向的结果查询只包含那些有电话号码的行。 这很好,因为你通常有很多没有数字的联系人。 此外,PROJECTION会限制返回的数据量。

 String key, value, phoneNumber; Hashtable contactPhoneInfo = new Hashtable<String, String>(); Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String [] PHONES_PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }; String PHONE_SELECTION = null; contacts.moveToFirst(); do{ long contactId = contacts.getLong(idColumnIndex); PHONE_SELECTION = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId; Cursor phones = managedQuery(phoneUri, PHONES_PROJECTION, null, null, ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC"); phones.moveToFirst(); key = phones.getString(0).replaceAll("\\D", ""); value = contacts.getString(nameColumnIndex); contactPhoneInfo.put(key, value); }while(contacts.moveToNext()); contacts.close(); } 

上面的块获取与具有电话号码的每个联系人ID相关联的电话号码。 我将所有信息存储在散列表中,并将电话号码的键值存储起来。 我也剥离了所有无数字信息的电话号码。 由于某些原因,即使ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER是有效的,如果将其包含在投影参数中,它将打破查询,但我不知道为什么,它令人沮丧。

上面的代码的第二部分太慢了,所有的查询调用只是把所有的东西都closures了。 下面的代码要快得多。 只需抓住手机内容的所有行,然后使用contact_ids对所需的数据进行sorting即可。

 Cursor phones = managedQuery(phoneUri, PHONES_PROJECTION, PHONE_SELECTION, null, ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC"); contacts.moveToFirst(); do{ value = ""; key = contacts.getString(idColumnIndex); contactPhoneInfo.put(key, value); }while(contacts.moveToNext()); phones.moveToFirst(); Set keySet = contactPhoneInfo.keySet(); idColumnIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); int numColumnIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); do{ key = phones.getString(idColumnIndex); if(keySet.contains(key)){ value = phones.getString(numColumnIndex).replaceAll("\\D", ""); contactPhoneInfo.put(key, value); } }while(phones.moveToNext()); 

你最终得到一个包含你想要的所有信息的散列表。 当然,你可以把你想要的任何信息放入数据结构中。 做这件事的第二种方法要快得多。

只是想添加,当你检索的联系人,你可能会得到很多“垃圾”的联系人 – 例如一些用户有一些电子邮件地址发送电子邮件,但不汇总…如果你只想联系人对用户可见,如在Android自己的联系人应用程序中,您需要将select限制为只有IN_VISIBLE_GROUP。

  String where = ContactsContract.Contacts.IN_VISIBLE_GROUP + "= ? "; String[] selectionArgs = new String[] { "1" }; 

我认为从这个URL http://coderzheaven.com/2011/06/get-all-details-from-contacts-in-android/在StackOverflow的代码导致有时这样的链接是很重要的。;

  public void readContacts(){ ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { System.out.println("name : " + name + ", ID : " + id); // get the phone number Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); while (pCur.moveToNext()) { String phone = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("phone" + phone); } pCur.close(); // get email and type Cursor emailCur = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses // if the email addresses were stored in an array String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); System.out.println("Email " + email + " Email Type : " + emailType); } emailCur.close(); // Get note....... String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] noteWhereParams = new String[]{id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null); if (noteCur.moveToFirst()) { String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE)); System.out.println("Note " + note); } noteCur.close(); //Get Postal Address.... String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] addrWhereParams = new String[]{id, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; // Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, // null, null, null, null); Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null, addrWhere, addrWhereParams, null); while(addrCur.moveToNext()) { String poBox = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); String street = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); String city = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); String state = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); String postalCode = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); String country = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); String type = addrCur.getString( addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); // Do something with these.... } addrCur.close(); // Get Instant Messenger......... String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] imWhereParams = new String[]{id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, null, imWhere, imWhereParams, null); if (imCur.moveToFirst()) { String imName = imCur.getString( imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); String imType; imType = imCur.getString( imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)); } imCur.close(); // Get Organizations......... String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] orgWhereParams = new String[]{id, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, null, orgWhere, orgWhereParams, null); if (orgCur.moveToFirst()) { String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); } orgCur.close(); } } } } 

强调文本

我发现很容易阅读联系人的解决scheme。 (无聊的编写代码读取每个值,所以使用包装类的联系人是很好的)

当然<uses-permission android:name="android.permission.READ_CONTACTS"/>

ContactList.java

 package com.test; import java.util.ArrayList; public class ContactList { private ArrayList<Contact> contacts = new ArrayList<Contact>(); public ArrayList<Contact> getContacts() { return contacts; } public void setContacts(ArrayList<Contact> contacts) { this.contacts = contacts; } public void addContact(Contact contact) { this.contacts.add(contact); } public ContactList() { } } 

Contact.java

 package com.test; import java.util.ArrayList; public class Contact { private String id; private String displayName; private ArrayList<Phone> phone; private ArrayList<Email> email; private ArrayList<String> notes; private ArrayList<Address> addresses = new ArrayList<Address>(); private ArrayList<IM> imAddresses; private Organization organization; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public ArrayList<Phone> getPhone() { return phone; } public void setPhone(ArrayList<Phone> phone) { this.phone = phone; } public void addPhone(Phone phone) { this.phone.add(phone); } public ArrayList<Email> getEmail() { return email; } public void setEmail(ArrayList<Email> email) { this.email = email; } public void addEmail(Email email) { this.email.add(email); } public ArrayList<String> getNotes() { return notes; } public void setNotes(ArrayList<String> notes) { this.notes = notes; } public void AddNotes(String notes){ this.notes.add(notes); } public ArrayList<Address> getAddresses() { return addresses; } public void setAddresses(ArrayList<Address> addresses) { this.addresses = addresses; } public void addAddress(Address address) { this.addresses.add(address); } public ArrayList<IM> getImAddresses() { return imAddresses; } public void setImAddresses(ArrayList<IM> imAddresses) { this.imAddresses = imAddresses; } public void addImAddresses(IM imAddr) { this.imAddresses.add(imAddr); } public Organization getOrganization() { return organization; } public void setOrganization(Organization organization) { this.organization = organization; } } 

Address.java

 package com.test; public class Address { private String poBox; private String street; private String city; private String state; private String postalCode; private String country; private String type; private String asString = ""; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getPoBox() { return poBox; } public void setPoBox(String poBox) { this.poBox = poBox; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getPostalCode() { return postalCode; } public void setPostalCode(String postalCode) { this.postalCode = postalCode; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String toString() { if (this.asString.length() > 0) { return(this.asString); } else { String addr = ""; if (this.getPoBox() != null) { addr = addr + this.getPoBox() + "n"; } if (this.getStreet() != null) { addr = addr + this.getStreet() + "n"; } if (this.getCity() != null) { addr = addr + this.getCity() + ", "; } if (this.getState() != null) { addr = addr + this.getState() + " "; } if (this.getPostalCode() != null) { addr = addr + this.getPostalCode() + " "; } if (this.getCountry() != null) { addr = addr + this.getCountry(); } return(addr); } } public Address(String asString, String type) { this.asString = asString; this.type = type; } public Address(String poBox, String street, String city, String state, String postal, String country, String type) { this.setPoBox(poBox); this.setStreet(street); this.setCity(city); this.setState(state); this.setPostalCode(postal); this.setCountry(country); this.setType(type); } } 

Email.java

 package com.test; public class Email { private String address; private String type; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getType() { return type; } public void setType(String t) { this.type = t; } public Email(String a, String t) { this.address = a; this.type = t; } } 

Im.java

 package com.test; public class IM { private String name; private String type; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public IM(String name, String type) { this.name = name; this.type = type; } } 

Organization.java

 package com.test; public class Organization { private String organization = ""; private String title = ""; public String getOrganization() { return organization; } public void setOrganization(String organization) { this.organization = organization; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Organization() { } public Organization(String org, String title) { this.organization = org; this.title = title; } } 

Phone.java

 package com.test; public class Phone { private String number; private String type; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Phone(String n, String t) { this.number = n; this.type = t; } } 

ContactAPI.java

 package com.test; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.os.Build; public abstract class ContactAPI { private static ContactAPI api; public static ContactAPI getAPI() { if (api == null) { String apiClass; if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.ECLAIR) { apiClass = "com.*********.ContactAPISdk5"; } else { apiClass = "com.*********.ContactAPISdk3"; } try { Class<? extends ContactAPI> realClass = Class.forName(apiClass). asSubclass(ContactAPI.class); api = realClass.newInstance(); } catch (Exception e) { throw new IllegalStateException(e); } } return api; } public abstract Intent getContactIntent(); public abstract ContactList newContactList(); public abstract Cursor getCur(); public abstract void setCur(Cursor cur); public abstract ContentResolver getCr(); public abstract void setCr(ContentResolver cr); } 

ContactAPISdk5.java

 package com.test; import java.util.ArrayList; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.provider.ContactsContract; public class ContactAPISdk5 extends ContactAPI { private Cursor cur; private ContentResolver cr; public Cursor getCur() { return cur; } public void setCur(Cursor cur) { this.cur = cur; } public ContentResolver getCr() { return cr; } public void setCr(ContentResolver cr) { this.cr = cr; } public Intent getContactIntent() { return(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)); } public ContactList newContactList() { ContactList contacts = new ContactList(); String id; this.cur = this.cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (this.cur.getCount() > 0) { while (cur.moveToNext()) { Contact c = new Contact(); id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); c.setId(id); c.setDisplayName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { c.setPhone(this.getPhoneNumbers(id)); } c.setEmail(this.getEmailAddresses(id)); c.setNotes(this.getContactNotes(id)); c.setAddresses(this.getContactAddresses(id)); c.setImAddresses(this.getIM(id)); c.setOrganization(this.getContactOrg(id)); contacts.addContact(c); } } return(contacts); } public ArrayList<Phone> getPhoneNumbers(String id) { ArrayList<Phone> phones = new ArrayList<Phone>(); Cursor pCur = this.cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); while (pCur.moveToNext()) { phones.add(new Phone( pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) , pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)) )); } pCur.close(); return(phones); } public ArrayList<Email> getEmailAddresses(String id) { ArrayList<Email> emails = new ArrayList<Email>(); Cursor emailCur = this.cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses Email e = new Email(emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)) ,emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)) ); emails.add(e); } emailCur.close(); return(emails); } public ArrayList<String> getContactNotes(String id) { ArrayList<String> notes = new ArrayList<String>(); String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; Cursor noteCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); if (noteCur.moveToFirst()) { String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE)); if (note.length() > 0) { notes.add(note); } } noteCur.close(); return(notes); } public ArrayList<Address> getContactAddresses(String id) { ArrayList<Address> addrList = new ArrayList<Address>(); String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{id, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; Cursor addrCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); while(addrCur.moveToNext()) { String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); String state = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); Address a = new Address(poBox, street, city, state, postalCode, country, type); addrList.add(a); } addrCur.close(); return(addrList); } public ArrayList<IM> getIM(String id) { ArrayList<IM> imList = new ArrayList<IM>(); String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; Cursor imCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); if (imCur.moveToFirst()) { String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); String imType; imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)); if (imName.length() > 0) { IM im = new IM(imName, imType); imList.add(im); } } imCur.close(); return(imList); } public Organization getContactOrg(String id) { Organization org = new Organization(); String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{id, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; Cursor orgCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); if (orgCur.moveToFirst()) { String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); if (orgName.length() > 0) { org.setOrganization(orgName); org.setTitle(title); } } orgCur.close(); return(org); } } 

ContactAPISdk3.java

 package com.test; import java.util.ArrayList; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.provider.Contacts; import android.provider.Contacts.People; public class ContactAPISdk3 extends ContactAPI { private Cursor cur; private ContentResolver cr; public Cursor getCur() { return cur; } public void setCur(Cursor cur) { this.cur = cur; } public ContentResolver getCr() { return cr; } public void setCr(ContentResolver cr) { this.cr = cr; } public Intent getContactIntent() { return(new Intent(Intent.ACTION_PICK, People.CONTENT_URI)); } public ContactList newContactList() { ContactList contacts = new ContactList(); String id=""; this.cur = this.cr.query(People.CONTENT_URI, null, null, null, null); if (this.cur.getCount() > 0) { while (cur.moveToNext()) { Contact c = new Contact(); id = cur.getString(cur.getColumnIndex(People._ID)); c.setId(id); c.setDisplayName(cur.getString(cur.getColumnIndex(People.DISPLAY_NAME))); if (Integer.parseInt(cur.getString(cur.getColumnIndex(People.PRIMARY_PHONE_ID))) > 0) { c.setPhone(this.getPhoneNumbers(id)); } c.setEmail(this.getEmailAddresses(id)); ArrayList<String> notes = new ArrayList<String>(); notes.add(cur.getString(cur.getColumnIndex(People.NOTES))); c.setNotes(notes); c.setAddresses(this.getContactAddresses(id)); c.setImAddresses(this.getIM(id)); c.setOrganization(this.getContactOrg(id)); contacts.addContact(c); } } return(contacts); } public ArrayList<Phone> getPhoneNumbers(String id) { ArrayList<Phone> phones = new ArrayList<Phone>(); Cursor pCur = this.cr.query( Contacts.Phones.CONTENT_URI, null, Contacts.Phones.PERSON_ID +" = ?", new String[]{id}, null); while (pCur.moveToNext()) { phones.add(new Phone( pCur.getString(pCur.getColumnIndex(Contacts.Phones.NUMBER)) , pCur.getString(pCur.getColumnIndex(Contacts.Phones.TYPE)) )); } pCur.close(); return(phones); } public ArrayList<Email> getEmailAddresses(String id) { ArrayList<Email> emails = new ArrayList<Email>(); Cursor emailCur = this.cr.query( Contacts.ContactMethods.CONTENT_EMAIL_URI, null, Contacts.ContactMethods.PERSON_ID + " = ?", new String[]{id}, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses Email e = new Email(emailCur.getString(emailCur.getColumnIndex(Contacts.ContactMethods.DATA)) ,emailCur.getString(emailCur.getColumnIndex(Contacts.ContactMethods.CONTENT_EMAIL_TYPE)) ); emails.add(e); } emailCur.close(); return(emails); } public ArrayList<Address> getContactAddresses(String id) { ArrayList<Address> addrList = new ArrayList<Address>(); String where = Contacts.ContactMethods.PERSON_ID + " = ? AND " + Contacts.ContactMethods.KIND + " = ?"; String[] whereParameters = new String[]{id, Contacts.ContactMethods.CONTENT_POSTAL_ITEM_TYPE}; Cursor addrCur = this.cr.query(Contacts.ContactMethods.CONTENT_URI, null, where, whereParameters, null); while(addrCur.moveToNext()) { String addr = addrCur.getString(addrCur.getColumnIndex(Contacts.ContactMethodsColumns.DATA)); String type = addrCur.getString(addrCur.getColumnIndex(Contacts.ContactMethodsColumns.TYPE)); Address a = new Address(addr, type); addrList.add(a); } addrCur.close(); return(addrList); } public ArrayList<IM> getIM(String id) { ArrayList<IM> imList = new ArrayList<IM>(); String where = Contacts.ContactMethods.PERSON_ID + " = ? AND " + Contacts.ContactMethods.KIND + " = ?"; String[] whereParameters = new String[]{id, Contacts.ContactMethods.CONTENT_IM_ITEM_TYPE}; Cursor imCur = this.cr.query(Contacts.ContactMethods.CONTENT_URI, null, where, whereParameters, null); if (imCur.moveToFirst()) { String imName = imCur.getString(imCur.getColumnIndex(Contacts.ContactMethodsColumns.DATA)); String imType = imCur.getString(imCur.getColumnIndex(Contacts.ContactMethodsColumns.TYPE)); if (imName.length() > 0) { IM im = new IM(imName, imType); imList.add(im); } } imCur.close(); return(imList); } public Organization getContactOrg(String id) { Organization org = new Organization(); String where = Contacts.ContactMethods.PERSON_ID + " = ?"; String[] whereParameters = new String[]{id}; Cursor orgCur = this.cr.query(Contacts.Organizations.CONTENT_URI, null, where, whereParameters, null); if (orgCur.moveToFirst()) { String orgName = orgCur.getString(orgCur.getColumnIndex(Contacts.Organizations.COMPANY)); String title = orgCur.getString(orgCur.getColumnIndex(Contacts.Organizations.TITLE)); if (orgName.length() > 0) { org.setOrganization(orgName); org.setTitle(title); } } orgCur.close(); return(org); } } 

注意 :不要忘了改变包名称,而不是*******

来源 (链接可以随时死亡:))

把这个…

 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 Number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } 

让我知道如果有任何问题。

这部分不适合我:

  while (phones.moveToNext()) { String phoneNumber = phones.getString( phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); } 

如果我使用这个,但是,它确实:

  while (phones.moveToNext()) { String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); Log.v("DATA",pdata); } 

您可以使用android开发人员站点(OR)的“ContactManager”示例转到已设置path的位置,以在您的系统中下载android-sdk。 在android-sdk-mac_x86 / samples / android-10文件夹中,可以看到“ContactManager”的例子。

我试过使用这个例子,在我的应用程序中运行良好。

我使用三星Galaxy Note 4,我不知道为什么以上都没有为我工作。 我混了一些,并做了这个woking ..

  Cursor people = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); people.moveToFirst(); while(people.moveToNext()) { int nameFieldColumnIndex = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); String contact = people.getString(nameFieldColumnIndex); int numberFieldColumnIndex = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA); String number = people.getString(numberFieldColumnIndex); dbWriter.execSQL("Insert Into ContactsList (ContactName, ContactNumber) Values (" + "'" + contact.replace("'", "''") + "', '" + number.replace("'", "''") + "')"); } people.close();