根据帐户名

时间:2017-08-17 10:14:09

标签: android android-contentprovider android-contacts

我无法从RawContacts表中获取所有联系ID

private void displayAllContactsByType(String accountName)
 {//e.g accountName="WHATSAPP"

    Cursor rawCursor = null;

        rawCursor = cResolver.query(
                ContactsContract.RawContacts.CONTENT_URI,
                new String[]{ContactsContract.RawContacts.CONTACT_ID},
                ContactsContract.RawContacts.ACCOUNT_NAME + "= ?",
                new String[]{accountName},
                ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE LOCALIZED ASC");


    rawCursor.moveToFirst();

    int contactIdColumn = rawCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID);
    int rawCursorCount = rawCursor.getCount();
    int total = 1;

    Utils.Log("Raw Size", " " + rawCursorCount);//rawCursorCount is correct here

    while (rawCursor.moveToNext()) {

        Long contactId = rawCursor.getLong(contactIdColumn);

        publishProgress(((total * 100) / rawCursorCount));
        progressBar.setProgressNumberFormat("" + total + "/" + rawCursorCount);

        storeContactDetails(contactId, accountName);
        ++total;
//I am facing problem in this method only below code is just for understanding.
    }
}

通过帐户名称将联系ID传递给下面的方法以获取相应ID的联系人详细信息,但联系人ID与日志//Utils.Log(“Raw Size”,“”+ rawCursorCount)相比较少。

 private void storeContactDetails(Long id, String accountName) {

    Cursor phones = null;
    String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.Contacts.LOOKUP_KEY,
            "account_name",
            Phone.TYPE
    };



    //Cursor c=cResolver.query(ContactsContract.Data.CONTENT_URI,projection,ContactsContract.Data.RAW_CONTACT_ID + " = ?",new String[]{String.valueOf(id)} ,null);

        phones = cResolver.query(Phone.CONTENT_URI,
                projection,
                Phone.CONTACT_ID + " = ?",
                new String[]{String.valueOf(id)},
                null);


    phones.moveToFirst();
    getResultsFromPhoneCursor(phones, accountName);

}

    public void getResultsFromPhoneCursor(Cursor phones, String accountName) {

    int colorcounter = 0;
    String[] colorcounter_array = {"#91A46B", "#8BB6B5", "#CAA973", "#8DA6C8", "#D19B8D"};

    int color_string;
    String email_Id = "";
    String contactType = "";

    try {
        contactId = 0;
        String hasPhone = "";
        display_name = "";
        phoneNumber = "";

        contactId = phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        display_name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)).trim();

        hasPhone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER));

        if (hasPhone.equalsIgnoreCase("1"))
            hasPhone = "true";

        else
            hasPhone = "false";

        if (Boolean.parseBoolean(hasPhone)) {
            do {

                this.accountName = phones.getString(phones.getColumnIndex("account_name"));
                phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));

                switch (type) {
                    case Phone.TYPE_HOME:
                        contactType = "HOME";
                        break;
                    case Phone.TYPE_MOBILE:
                        contactType = "MOBILE";
                        break;
                    case Phone.TYPE_WORK:
                        contactType = "WORK";
                        break;
                }

                String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));

                if (colorcounter < 5) {
                    color_string = Color.parseColor(colorcounter_array[colorcounter]);
                    colorcounter++;
                } else {
                    colorcounter = 0;
                    color_string = Color.parseColor(colorcounter_array[colorcounter]);
                    colorcounter++;
                }

                Cursor emails = cResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Email.DATA},
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);

                while (emails.moveToNext()) {
                    email_Id = emails.getString(emails
                            .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                }

                emails.close();

                if (this.accountName.equalsIgnoreCase(accountName)) {

                    if (!contactList.contains(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType)))
                        contactList.add(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType));
                }
            }

            while (phones.moveToNext());
            phones.close();
        }
    } catch (Exception e) {

        e.printStackTrace();
    }

}

请帮我解决此案例或建议任何其他方式来获取contact_ids。在此先感谢。

1 个答案:

答案 0 :(得分:1)

问题是您丢失了从数据库中获取的第一个联系人。

语句rawCursor.moveToFirst();将光标定位在第一个可用结果记录上。当您想迭代结果时,在循环中调用rawCursor.moveToNext()。循环条件在它的正文之前执行,因此,你最终将光标移动到第二行,丢失了第一条记录。

您可以通过删除rawCursor.moveToFirst()来解决此问题。