2009-11-12 89 views
93

我正在使用Android 2.0,並試圖接收所有聯繫人列表。如何在Android 2.0上閱讀聯繫人

由於android.provider.Contacts.People已過時,我不得不使用android.provider.ContactsContract,但我不能找到如何使用(一個適當的例子例如:檢索列表電話簿上的所有聯繫人)。

任何人都知道在哪裏可以找到這樣的例子?

+0

我真的很想知道這一點。我只能找到舊方法的例子。 – Jess 2009-11-12 21:22:40

回答

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類型。

+0

這是完美的哈維爾,感謝這個,我不得不去適應它了一下我的目的(查看聯繫人是否在避免再次添加)。這裏是我的代碼,如果你想將它添加到你的信息: 的String [] contactNameColumn = {} ContactsContract.Contacts.DISPLAY_NAME; 。 \t \t光標checkContactInDatabase = getContentResolver()的查詢(ContactsContract.Contacts.CONTENT_URI,contactNameColumn, \t \t \t \t ContactsContract.Contacts.DISPLAY_NAME + 「=」 + 「 '」 +名稱+ 「'」,NULL,NULL);如果(checkContactInDatabase.moveToFirst())int nameFieldColumnIndex = checkContactInDatabase.getColumnIndex(PhoneLookup.DISPLAY_NAME); if(checkContactInDatabase.moveToFirst()) – Sephy 2010-05-28 09:40:23

+0

String contact = checkContactInDatabase.getString(nameFieldColumnIndex); (Contact.this,contact +「」+ getString(R.string.alreadySaved),Toast.LENGTH_SHORT).show();();}}。 \t \t} else { \t \t \t Intent i = new Intent(Intent.ACTION_INSERT_OR_EDIT); \t \t \t i.setType(Contacts.CONTENT_ITEM_TYPE); \t \t \t i.putExtra(Insert.NAME,姓名); \t \t \t i.putExtra(Insert.PHONE,phone); (Insert.COMPANY,公司); \t \t \t i.putExtra(Insert.POSTAL,adresse); \t \t \t startActivity(i); \t \t} \t \t checkContactInDatabase.close(); – Sephy 2010-05-28 09:40:51

+7

嗨,我總是在這個陳述if(Boolean.parseBoolean(hasPhone));即使hasPhone的值=「1」 – Vamsi 2010-11-29 07:22:46

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

上面的代碼塊返回指向只包含那些有電話號碼的行產生的查詢的指針。這很好,因爲你通常有很多沒有數字的聯繫人。此外,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中做一個混亂的模擬連接。 – 2010-12-17 16:28:37

3

您可以使用android開發人員網站上的「ContactManager」示例 (OR) 轉到您已設置路徑以在系統中下載android-sdk的位置。在android-sdk-mac_x86/samples/android-10文件夾中,可以看到「ContactManager」示例。

我試過使用這個例子,在我的應用程序中運行良好。

18

只是想添加,當你檢索聯繫人時,你可能會得到很多「垃圾」聯繫人 - 例如某些用戶在某一時刻發送電子郵件但不彙總的電子郵件地址...如果您只想讓用戶看到聯繫人,就像在Android自己的聯繫人應用程序中一樣,您需要將選擇限制爲只有IN_VISIBLE_GROUP。

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

優秀的加法。 – 2012-04-28 22:15:25

+1

謝謝,謝謝,謝謝。 – Steelight 2012-08-28 08:47:06

14

我認爲有從StackOverflow上導致此URL http://coderzheaven.com/2011/06/get-all-details-from-contacts-in-android/代碼有時鏈接一樣,往下走是很重要的。

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

請注意,此代碼可能存在性能問題。看到的問題:http://stackoverflow.com/questions/10921109/get-contacts-performance-issue – oshai 2012-06-07 06:40:07

+0

非常低效,不要使用此代碼...可能需要一分鐘! – xnagyg 2015-01-05 20:59:36

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

讓我知道如果任何問題。

8

我發現很容易閱讀聯繫人的解決方案。 (無聊地編寫代碼讀取每個值,這是很好的使用聯繫人包裝類)

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

注意:不要忘記更改包名稱,而不是*******

Source(鏈路可以是死的任何時間:))

0

我使用的是三星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();