Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 根据帐户名查询原始联系人表时缺少联系人ID_Android_Android Contentprovider_Android Contacts - Fatal编程技术网

Android 根据帐户名查询原始联系人表时缺少联系人ID

Android 根据帐户名查询原始联系人表时缺少联系人ID,android,android-contentprovider,android-contacts,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,

我无法从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(“原始大小”,“rawCursorCount+rawCursorCount”)相比较少

private void storeContactDetails(长id、字符串accountName){
光标=空;
字符串[]投影=新字符串[]{ContactsContract.CommonDataTypes.Phone.CONTACT\u ID,
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.HAS_Phone_号码,
Contacts contract.CommonDataTypes.Phone.NUMBER,
Contacts contract.Contacts.LOOKUP_键,
“账户名称”,
电话号码
};
//游标c=cResolver.query(ContactsContract.Data.CONTENT\u URI,投影,ContactsContract.Data.RAW\u CONTACT\u ID+“=?”,新字符串[]{String.valueOf(ID)},null);
phones=cResolver.query(Phone.CONTENT\u URI,
预测
Phone.CONTACT_ID+“=?”,
新字符串[]{String.valueOf(id)},
无效);
moveToFirst();
getResultsFromPhoneCursor(电话、帐户名);
}
public void getResultsFromPhoneCursor(光标电话,字符串accountName){
int colorcounter=0;
字符串[]colorcounter_数组={“#91A46B”、“#8BB6B5”、“#CAA973”、“#8DA6C8”、“#D19B8D”};
int颜色_字符串;
字符串email_Id=“”;
字符串contactType=“”;
试一试{
contactId=0;
字符串hasPhone=“”;
显示_name=“”;
电话号码=”;
contactId=phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.CONTACT\u ID));
display_name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.display_name)).trim();
hasPhone=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.HAS_Phone_NUMBER));
if(hasPhone.equalsIgnoreCase(“1”))
hasPhone=“true”;
其他的
hasPhone=“false”;
if(Boolean.parseBoolean(hasPhone)){
做{
this.accountName=phones.getString(phones.getColumnIndex(“account_name”));
phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
int type=phones.getInt(phones.getColumnIndex(Phone.type));
开关(类型){
case Phone.TYPE_HOME:
contactType=“主页”;
打破
手机壳。手机类型:
contactType=“手机”;
打破
case Phone.TYPE_工作:
contactType=“工作”;
打破
}
String lookupKey=phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
if(颜色计数器<5){
color_string=color.parseColor(colorcounter_数组[colorcounter]);
彩色计数器++;
}否则{
颜色计数器=0;
color_string=color.parseColor(colorcounter_数组[colorcounter]);
彩色计数器++;
}
Cursor emails=cResolver.query(ContactsContract.commondatatypes.Email.CONTENT_URI,新字符串[]{ContactsContract.commondatatypes.Email.DATA},
ContactsContract.CommonDataTypes.Email.CONTACT_ID+“=”+contactId,null,null);
while(emails.moveToNext()){
email\u Id=emails.getString(emails
.getColumnIndex(ContactsContract.CommonDataTypes.Email.DATA));
}
电子邮件。关闭();
if(this.accountName.equalsIgnoreCase(accountName)){
如果(!contactList.contains(新的ContactsWrapper(contactId、display\u name、phoneNumber、lookupKey、false、color\u string、email\u Id、contactType)))
contactList.add(新ContactsWrapper(contactId、display_name、phoneNumber、lookupKey、false、color_字符串、email_Id、contactType));
}
}
while(phones.moveToNext());
电话。关闭();
}
}捕获(例外e){
e、 printStackTrace();
}
}

请帮我解决这个问题,或者建议其他获取联系人ID的方法。提前感谢。

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

语句
rawCursor.moveToFirst()将光标定位在第一条可用的结果记录上。当您想要迭代结果时,可以在循环内调用
rawCursor.moveToNext()
。循环条件在其主体之前执行,因此,您最终将光标移动到第二行,丢失第一条记录

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

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

}