如何在Android 2.0上阅读联系人


95

我正在使用Android 2.0,正在尝试接收所有联系人的列表。

由于android.provider.Contacts.People已过时,我不得不使用android.provider.ContactsContract,但我不能找到如何使用适当的例子(例如:检索电话簿的所有联系人的列表)。

有人知道在哪里可以找到这样的例子吗?


我也很想知道这一点。我只能在旧方法上找到示例。
杰斯

Answers:


160

首先,请确保您已添加

<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,还使用了MIME类型进行查询。


哈维尔(Javier)非常完美,为此,我不得不为自己的目的进行一些调整(检查联系人是否在位以避免再次添加)。这是我的代码,如果您想将其添加到您的帖子中:String [] contactNameColumn = {ContactsContract.Contacts.DISPLAY_NAME}; 游标checkContactInDatabase = getContentResolver()。query(ContactsContract.Contacts.CONTENT_URI,contactNameColumn,ContactsContract.Contacts.DISPLAY_NAME +“ =” +“'” +名称+“'”,null,null);如果(checkContactInDatabase.moveToFirst()){int nameFieldColumnIndex = checkContactInDatabase.getColumnIndex(PhoneLookup.DISPLAY_NAME);
Sephy 2010年

字符串contact = checkContactInDatabase.getString(nameFieldColumnIndex); Toast.makeText(Contact.this,contact +“” + getString(R.string.alreadySaved),Toast.LENGTH_SHORT).show(); } else {Intent i = new Intent(Intent.ACTION_INSERT_OR_EDIT); i.setType(Contacts.CONTENT_ITEM_TYPE); i.putExtra(Insert.NAME,名称); i.putExtra(插入电话,电话); i.putExtra(Insert.COMPANY,公司); i.putExtra(Insert.POSTAL,adresse); startActivity(i); } checkContactInDatabase.close();
Sephy 2010年

7
嗨,如果(Boolean.parseBoolean(hasPhone));我总是在此声明为假。即使hasPhone的值=“ 1”
Vamsi

1
代替emails.getColumnIndex(ContactsContract.CommonDataKinds.CommonDataColumns.DATA)); 您还可以使用emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
erdomester 2011年

2
您将如何获得联系人照片?我见过许多关于SO的所谓解决方案,但它们在很大程度上是不可靠的……
SpicyWeenie 2012年

22

很高兴看到一些有用的信息,令人沮丧的是文档等对这一重要主题的覆盖程度很差。经过太多的骇客攻击之后,我想我也会分享一些代码。以下代码更漂亮,并且可以更高效地完成同一工作。

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有效,如果您在投影参数中包含该参数,它也会打断查询,但我不知道为什么,而且这样做令人沮丧。

上面代码的第二部分太慢,所有查询调用都使所有内容陷入瘫痪。下面的代码要快得多。只需获取电话内容的所有行,然后使用contact_ids即可对所需数据进行排序。

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()); 

您最终得到一个包含所有所需信息的哈希表。当然,您可以将所需的任何信息放入数据结构中。第二种方法要快得多。


2
如果您只想要一些相关联系人的信息,则还可以ContactsContract.Data.DISPLAY_NAME在投影中使用隐式联接列(例如)。那么您就不必在Java中进行混乱的模拟联接。
Yoni Samlan

18

只是想添加一下,当您检索联系人时,您可能会收到很多“垃圾”联系人-例如,用户在某些时候拥有的一些电子邮件地址会向其发送电子邮件,但这些电子邮件地址不会汇总...如果仅用户可见的联系人,例如在Android自己的联系人应用程序中,您需要将选择限制为仅IN_VISIBLE_GROUP。

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

14

我认为从该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();
                }
            }
       }
    }

强调文字


2
请注意,此代码可能存在性能问题。见问题:stackoverflow.com/questions/10921109/...
oshai

非常低效,请不要使用此代码...可能需要一分钟!
xnagyg,2015年

9

我发现阅读联系人非常简单的解决方案。(无聊地编写用于读取每个值的代码,因此对联系人使用包装器类是很好的)

当然 <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;
}
}

地址.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;
 }
}

电话.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);

}

联系人APISdk5.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);
 }
 }

注意:不要忘记更改软件包名称*******

来源(链接可以随时消失:)


6

把这个....

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));
}

让我知道是否有任何问题。


3

这部分对我不起作用:

 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);
}

3

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

我尝试使用此示例,在我的应用程序中运行良好。


0

我正在使用Samsung Galaxy Note 4,但我不知道为什么以上都不对我有用。我混合了一些,然后把它烧了。

    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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.