2010-12-07 3 views
2

Comment filtrer les contacts renvoyés par le groupName?Utilisation du curseur ContactsContract pour obtenir les contacts par groupe

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int pos, 
     long id) { 
    String groupName = parent.getItemAtPosition(pos).toString(); 
    Log.i(this.toString(), String.format("Show Group: %s", groupName)); 

    Cursor cur = this.getContentResolver().query(
      ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String name = cur 
        .getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (name != null) { 
       Log.i(this.toString(), String.format("Show: %s", name)); 
      } 
     } 

     cur.close(); 
    } 
} 

Répondre

2

j'ai pu filtrer les contacts par groupe en utilisant la requête suivante:

Cursor c = this.managedQuery(Data.CONTENT_URI, new String[] { 
        Contacts.DISPLAY_NAME, Contacts._ID }, 
        GroupMembership.GROUP_ROW_ID + " = ?", 
        new String[] { groupId }, Phone.TIMES_CONTACTED + " DESC"); 

Il est évident que vous devez connaître le Id Group afin de compléter cela, comment je l'ai fait a été utilisé un SimpleCursorAdapter à un Spinner w/les éléments suivants Cursor:

Cursor c = managedQuery(Groups.CONTENT_URI, 
         new String[] { Groups.SYSTEM_ID, Groups._ID,}, 
         Groups.SYSTEM_ID + " NOT NULL", 
         null, null); 
1

Malheureusement, seulement des groupes système (les « groupes qui ont une signification particulière à l'adaptateur de synchronisation ») ont SYSTEM_IDs. Donc, cette méthode n'est pas à l'épreuve des balles.

2

Cela fonctionne pour moi pour obtenir tous les groupes ID plutôt que seulement les ID système:

public HashMap<String, Long> fillGroupsHashMap(HashMap<String, Long> groups) // 
{ 

    Cursor tempCur = activity.managedQuery(Groups.CONTENT_URI, 
      new String[] { Groups._ID, Groups.TITLE }, null, null, null); 

    tempCur.moveToFirst(); 
    while (tempCur.moveToNext()) // 
    { 
     groups.put(tempCur.getString(1), tempCur.getLong(0)); 
    } 
    return groups; 
} 
0

J'ai eu un heachache avec cela, mais finalement j'obtenir ce travail avec le code whis, et maintenant je peux filtrer seulement numéros de téléphone et éviter les groupes répétés et inutilisés:

String[] GROUP_PROJECTION = new String[] { 
    ContactsContract.Groups._ID, ContactsContract.Groups.TITLE,ContactsContract.Groups.SUMMARY_COUNT ,ContactsContract.Groups.SUMMARY_WITH_PHONES }; 
    Cursor c = context.getApplicationContext().getContentResolver().query(
       ContactsContract.Groups.CONTENT_SUMMARY_URI, 
       GROUP_PROJECTION, 
       ContactsContract.Groups.SUMMARY_WITH_PHONES +"> 0" 
      , null, ContactsContract.Groups.TITLE + " ASC"); 
Questions connexes