Come leggere i contatti su Android 2.0


95

Sto lavorando su Android 2.0 e sto cercando di ricevere un elenco di tutti i contatti.

Poiché android.provider.Contacts.People è deprecato, devo usare android.provider.ContactsContract , ma non riesco a trovare un esempio corretto di come usarlo (es: recuperare un elenco di tutti i contatti sulla rubrica).

Qualcuno sa dove trovare un simile esempio?


Mi piacerebbe davvero sapere anche questo. Posso trovare solo esempi sul vecchio metodo.
Jess

Risposte:


160

Innanzitutto, assicurati di aver aggiunto

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

al tuo file AndroidManifest.xml, quindi puoi scorrere i contatti del telefono in questo modo:

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

Inoltre, puoi scorrere i tuoi contatti e ottenere semplicemente il nome e il numero di telefono in questo modo:

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

Inoltre, se hai bisogno di ottenere cose come note da un contatto, dovrai usare un URI diverso, come il seguente (sentiti libero di usare questo metodo):

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

Notare che questa volta ho usato non solo l'id del contatto ma il tipo MIME per la query.


È stato perfetto Javier, grazie per questo, ho dovuto adattarlo un po 'per il mio scopo (controlla se c'è un contatto per evitare di aggiungere di nuovo). Ecco il mio codice se vuoi aggiungerlo al tuo post: String [] contactNameColumn = {ContactsContract.Contacts.DISPLAY_NAME}; Cursore checkContactInDatabase = getContentResolver (). Query (ContactsContract.Contacts.CONTENT_URI, contactNameColumn, ContactsContract.Contacts.DISPLAY_NAME + "=" + "'" + name + "'", null, null); if (checkContactInDatabase.moveToFirst ()) {int nameFieldColumnIndex = checkContactInDatabase.getColumnIndex (PhoneLookup.DISPLAY_NAME);
Sephy

String 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, name); i.putExtra (Insert.PHONE, phone); i.putExtra (Insert.COMPANY, companie); i.putExtra (Insert.POSTAL, adresse); startActivity (i); } checkContactInDatabase.close ();
Sephy

7
Ciao, ottengo false sempre a questa affermazione if (Boolean.parseBoolean (hasPhone)); anche se hasPhone ha valore = "1"
Vamsi

1
Invece di emails.getColumnIndex (ContactsContract.CommonDataKinds.CommonDataColumns.DATA)); puoi anche utilizzare emailAddress = emails.getString (emails.getColumnIndex (ContactsContract.CommonDataKinds.Phone.DATA));
erdomester

2
Come otterresti la foto del contatto? Ho visto molte cosiddette soluzioni su SO, ma sono in gran parte inaffidabili ...
SpicyWeenie

22

È bello vedere alcune informazioni utili, è frustrante quanto poco questo importante argomento sia coperto da documenti e simili. Dopo troppi hacking ho pensato di condividere anche un piccolo codice. Il codice seguente è un po 'più carino e fa la stessa cosa in modo più efficiente.

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

Il blocco di codice sopra riportato restituisce un Cursore che punta alla query risultante che contiene solo quelle righe che hanno un numero di telefono. Questo è utile poiché in genere hai molti contatti senza numeri. Inoltre, la PROIEZIONE limita la quantità di dati restituiti.

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

Il blocco precedente ottiene il numero di telefono associato a ciascun ID contatto che ha un numero di telefono. Memorizzo tutte le informazioni in una tabella hash e con un valore chiave del numero di telefono. Ho anche rimosso il numero di telefono da tutte le informazioni senza cifre. Per qualche motivo, anche se ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER è valido se includi che nell'argomento di proiezione interrompe la query, non so perché ed è frustrante che lo faccia.

La seconda parte del codice sopra è troppo lenta, tutte le chiamate di query impantanano tutto. Il codice seguente è molto più veloce. Prendi tutte le righe per il contenuto del telefono e usa contact_ids per ordinare i dati che desideri.

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

Ti ritroverai con una tabella hash con tutte le informazioni che desideri. Ovviamente puoi inserire tutte le informazioni che desideri nella struttura dei dati. Il secondo modo per farlo è molto più veloce.


2
Se vuoi solo alcune delle informazioni del contatto associato, puoi anche usare semplicemente le colonne di join implicito (come ContactsContract.Data.DISPLAY_NAME) nella tua proiezione; allora non dovresti fare un join simulato disordinato in Java.
Yoni Samlan

18

Voglio solo aggiungere, quando stai recuperando i contatti potresti ottenere molti contatti "spazzatura" - ad esempio alcuni indirizzi email a cui un utente ha a un certo punto inviare un'e-mail, ma non vengono aggregati ... Se vuoi solo i contatti visibili all'utente, come nell'applicazione dei contatti di Androids, è necessario limitare la selezione solo a IN_VISIBLE_GROUP.

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

14

Penso che sia importante avere il codice da questo URL http://coderzheaven.com/2011/06/get-all-details-from-contacts-in-android/ su StackOverflow perché a volte collegamenti come quello non funzionano.

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

testo enfatizzato


2
notare che questo codice potrebbe avere problemi di prestazioni. vedi domanda: stackoverflow.com/questions/10921109/...
oshai

Molto inefficiente, non utilizzare questo codice ... Potrebbe volerci un minuto!
xnagyg

9

Ho trovato una soluzione molto semplice per leggere i contatti. (noioso scrivere codice per leggere ogni valore, quindi è bene usare la classe wrapper per i contatti)

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

Indirizzo.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;
 }
}

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

Nota : non dimenticare di cambiare il nome del pacchetto *******.

Fonte (il collegamento può essere disattivato in qualsiasi momento :))


6

Metti questo ....

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

Fammi sapere se c'è qualche problema.


3

Questa parte non funzionerebbe per me:

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

Se lo uso, però, fa:

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

3

Puoi usare l'esempio "ContactManager" dal sito dello sviluppatore Android (OPPURE) Vai alla posizione in cui hai impostato il percorso per scaricare android-sdk nel tuo sistema. Nella cartella android-sdk-mac_x86 / samples / android-10, puoi vedere l'esempio "ContactManager".

Ho provato a utilizzare questo esempio, ha funzionato bene nella mia applicazione.


0

Sto usando Samsung Galaxy Note 4 e non so perché nessuno dei precedenti ha funzionato per me. Ne ho mescolati alcuni e ho fatto questa sveglia ..

    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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.