CHarris
CHarris

Reputation: 2793

how can I get phone numbers of corresponding names in my contacts?

This selection clause in my Cursor query returns only those contacts who have a phone number, which is what I want :

// we only want contacts that have a name and a phone number. If they have a phone number, the value is 1 (if not, it is 0)
                ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'" + " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",

My whole cursor query looks like this :

// this query only return contacts with phone number and is not duplicated
        phones = getContentResolver().query(
//                the table to query
                ContactsContract.Contacts.CONTENT_URI,
//                the columns to return
                null,
//               selection criteria :
// we only want contacts that have a name and a phone number. If they have a phone number, the value is 1 (if not, it is 0)
                ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'" + " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
//               selection criteria
                null,
//                display in ascending order
                ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

But how can I get the actual phone number for each contact ? Can I add something to the code above, or do I need to start a new Cursor query?

I think it's the latter.

I started a new Cursor query as a starting point :

phonestwo = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                             null,
                             ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = '" + ("1") + "'" + " AND " + ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + "=1",
                             null,
                             null);

But in logs in logcat I am getting the phones cursor has 134 records (correct, what I want!) and my phonestwo cursor has 196 records. In short, how can I get phone numbers corresponding to those 134 records?

Upvotes: 1

Views: 730

Answers (2)

CHarris
CHarris

Reputation: 2793

public class MainActivity extends Activity {


    Cursor cursor;
    ListView mainListView;
    ArrayList hashMapsArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (cursor != null) {
            cursor.moveToFirst();}
        try {

            cursor = getApplicationContext().getContentResolver()
                    .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            int Idx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
            int nameIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);

            int phoneNumberIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            int photoIdIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI);
            cursor.moveToFirst();


            Set<String> ids = new HashSet<>();
            do {
                System.out.println("=====>in while");
                String contactid=cursor.getString(Idx);
                if (!ids.contains(contactid)) {
                    ids.add(contactid);
                    HashMap<String, String> hashMap = new HashMap<String, String>();
                   String  name = cursor.getString(nameIdx);
                    String phoneNumber = cursor.getString(phoneNumberIdx);
                    String image = cursor.getString(photoIdIdx);
                    System.out.println("Id--->"+contactid+"Name--->"+name);
                    System.out.println("Id--->"+contactid+"Name--->"+name);
                    System.out.println("Id--->"+contactid+"Number--->"+phoneNumber);

                    if (!phoneNumber.contains("*")) {
                        hashMap.put("contactid", "" + contactid);
                        hashMap.put("name", "" + name);
                        hashMap.put("phoneNumber", "" + phoneNumber);
                        hashMap.put("image", "" + image);
                        // hashMap.put("email", ""+email);
                        if (hashMapsArrayList != null) {
                            hashMapsArrayList.add(hashMap);}
//                    hashMapsArrayList.add(hashMap);
                    }
                }

            } while (cursor.moveToNext());


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
}
}

Upvotes: 0

Shadab Ansari
Shadab Ansari

Reputation: 7070

To fetch the phone numbers associated with a contact you need to hit the Contacts Content Provider again.

First ask phones Cursor for the contact's id -

  String phoneContactId = phones.getString(phones.getColumnIndexOrThrow(BaseColumns._ID));

And then for every phoneContactId, you fetch all its associated phone numbers -

 Cursor pCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { phoneContactId }, null);

while (pCur.moveToNext()) {
                    int phoneType = pCur.getInt(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.TYPE));
                    String phoneNumber = pCur
                            .getString(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));

                }

Upvotes: 1

Related Questions