2012-06-27 14 views
22

Il mio codice è il seguente:Come ottenere i contatti il ​​numero di telefono in Android

String[] columns = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, columns, null, null, null); 

int ColumeIndex_ID = cursor.getColumnIndex(ContactsContract.Contacts._ID); 
int ColumeIndex_DISPLAY_NAME = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
int ColumeIndex_HAS_PHONE_NUMBER = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); 

while(cursor.moveToNext()) 
{ 
    String id = cursor.getString(ColumeIndex_ID); 
    String name = cursor.getString(ColumeIndex_DISPLAY_NAME); 
    String has_phone = cursor.getString(ColumeIndex_HAS_PHONE_NUMBER); 

    if(!has_phone.endsWith("0")) 
    { 
     System.out.println(name); 
     GetPhoneNumber(id); 
    }   
} 

cursor.close(); 


public String GetPhoneNumber(String id) 
{ 
    String number = ""; 
    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone._ID + " = " + id, null, null); 

    if(phones.getCount() > 0) 
    { 
     while(phones.moveToNext()) 
     { 
      number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     } 
     System.out.println(number); 
    } 

    phones.close(); 

    return number; 
} 

ottengo contatti nome di successo, ma ottenere il numero di telefono non riescono nel GetPhoneNumber().
phones.getCount() uguale a 0.
Come posso modificare?

+0

è necessario eseguire le query in modo asincrono utilizzando un 'CursorLoader'. –

+0

Acquista una semplice libreria per recuperare i contatti. [Github project source ed esempio qui] (https://github.com/nitiwari-dev/android-contact-extractor) – nitesh

risposta

56

Android Contact API per 2,0

// 
// Find contact based on name. 
// 
ContentResolver cr = getContentResolver(); 
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
    "DISPLAY_NAME = '" + NAME + "'", null, null); 
if (cursor.moveToFirst()) { 
    String contactId = 
     cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
    // 
    // Get all phone numbers. 
    // 
    Cursor phones = cr.query(Phone.CONTENT_URI, null, 
     Phone.CONTACT_ID + " = " + contactId, null, null); 
    while (phones.moveToNext()) { 
     String number = phones.getString(phones.getColumnIndex(Phone.NUMBER)); 
     int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 
     switch (type) { 
      case Phone.TYPE_HOME: 
       // do something with the Home number here... 
       break; 
      case Phone.TYPE_MOBILE: 
       // do something with the Mobile number here... 
       break; 
      case Phone.TYPE_WORK: 
       // do something with the Work number here... 
       break; 
     } 
    } 
    phones.close(); 
} 
cursor.close(); 

Per ulteriori informazioni vedere questo link

+0

Cursore cursor = getContentResolver(). Query (ContactsContract.Contacts.CONTENT_URI, columns, null, null, null); causa un errore di runtime. Se puoi aiutare .. –

+0

FYI, probabilmente la migliore risposta che ho visto a lavorare con i contatti. –

+0

Cursore phones = cr.query (Phone.CONTENT_URI, null, Phone._ID + "=" + contactId, null, null); sta lavorando per me –

7

provare questo.

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)); 
      Log.i("Names", name); 
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
      { 
       // Query phone here. Covered next 
       Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null); 
       while (phones.moveToNext()) { 
         String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         Log.i("Number", phoneNumber); 
         } 
       phones.close(); 
      } 

     } 
    } 
+5

questo dura 30 secondi per circa 500 contatti; a differenza della risposta K_Anas, che dura circa mezzo secondo. non raccomanderei di usarlo. almeno non ha funzionato per me – FilipLuch

2

è necessaria l'autorizzazione come -

android:name="android.permission.READ_CONTACTS"/> 

Poi, Chiamando il Contact Picker

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 

Poi,

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) { 
super.onActivityResult(reqCode, resultCode, data); 

switch (reqCode) { 
case (PICK_CONTACT) : 
    if (resultCode == Activity.RESULT_OK) { 
    Uri contactData = data.getData(); 
    Cursor c = managedQuery(contactData, null, null, null, null); 
    if (c.moveToFirst()) { 
    String name = c.getString(c.getColumnIndexOrThrow(People.NAME)); 
    // TODO Whatever you want to do with the selected contact name. 
    } 
} 
break; 
} 
} 
2

vecchia questione, ma non vedo il risposta seguente qui.

private static final String[] PROJECTION ={ 
     ContactsContract.Contacts._ID, 
     ContactsContract.CommonDataKinds.Phone.NUMBER, 
     ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, 
     ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, 
     ContactsContract.Contacts.LOOKUP_KEY, 
}; 

new CursorLoader(
     this, 
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     PROJECTION, 
     null, 
     null,//mSelectionArgs, 
     ContactsContract.Contacts.DISPLAY_NAME_PRIMARY 
); 

Usa indice di colonna ContactsContract.CommonDataKinds.Phone.NUMBER retreive il numero telefonico dal cursore.

0

U può utilizzare il selettore di contatti.

chiamata contatto selettore su qualsiasi tasto e utilizzare il codice qui sotto:

| * | Aggiungi: AndroidManifest.xml

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

| * | Cestino: activity_name.java

void calContctPickerFnc() 
{ 
    Intent calContctPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
    calContctPickerIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
    startActivityForResult(calContctPickerIntent, 1); 
} 

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(reqCode, resultCode, data); 

    switch (reqCode) 
    { 
     case (1) : 
      if (resultCode == Activity.RESULT_OK) 
      { 
       Uri contctDataVar = data.getData(); 

       Cursor contctCursorVar = getContentResolver().query(contctDataVar, null, 
         null, null, null); 
       if (contctCursorVar.getCount() > 0) 
       { 
        while (contctCursorVar.moveToNext()) 
        { 
         String ContctUidVar = contctCursorVar.getString(contctCursorVar.getColumnIndex(ContactsContract.Contacts._ID)); 

         String ContctNamVar = contctCursorVar.getString(contctCursorVar.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

         Log.i("Names", ContctNamVar); 

         if (Integer.parseInt(contctCursorVar.getString(contctCursorVar.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
         { 
          // Query phone here. Covered next 
          String ContctMobVar = contctCursorVar.getString(contctCursorVar.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
          Log.i("Number", ContctMobVar); 
         } 

        } 
       } 
      } 
      break; 
    } 
} 
0

tuo grado di aggiungere questo codice sul tuo Classe di attività:

private final int PICK_CONTACT = 5; 

    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 

    Intent intent = new Intent(Intent.ACTION_PICK, 
        ContactsContract.Contacts.CONTENT_URI); 
      intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
      startActivityForResult(intent, PICK_CONTACT); 

    //Your code 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == PICK_CONTACT && resultCode == RESULT_OK) { 
     Uri contactData = data.getData(); 

     Cursor phones = getContentResolver() 
       .query(contactData, 
         null, 
         null, 
         null, 
         null); 

     String name = "", phoneNumber = ""; 

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

     } 
     phones.close(); 
    } 
    } 
Problemi correlati