Android 传递联系人id以从联系人获取详细信息时获取游标IndexAutofBound异常

Android 传递联系人id以从联系人获取详细信息时获取游标IndexAutofBound异常,android,android-contentprovider,contact,rawcontacts,Android,Android Contentprovider,Contact,Rawcontacts,我根据帐户名获得一个人的联系方式,该帐户工作正常,但有姓名但没有号码的联系人除外。我也得到了这些联系人的id,但当我使用联系人id从手机光标获取详细信息时,会导致异常 private void displayAllContactsByType(String accountName) //account-name: Mobikwik { Cursor rawCursor = null; rawCursor = cResolver.query( Co

我根据帐户名获得一个人的联系方式,该帐户工作正常,但有姓名但没有号码的联系人除外。我也得到了这些联系人的id,但当我使用联系人id从手机光标获取详细信息时,会导致异常

  private void displayAllContactsByType(String accountName) //account-name: Mobikwik
 {

    Cursor rawCursor = null;

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


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

    Utils.Log("Raw Size", " " + rawCursorCount);

    while (rawCursor.moveToNext()) {

        contactId = rawCursor.getLong(contactIdColumn);
            storeContactDetails(contactId );
    }
    rawCursor.close();
}
从上面的方法中,我得到了用于获取下面方法中的数据的联系人id

private void storeContactDetails( Long contactId) //e.g contact_id-2512 
{

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


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

    phones.moveToFirst();
    getResultsFromPhoneCursor(phones);

}

public void getResultsFromPhoneCursor(Cursor phones) {

    String email_Id = "";
    String contactType = "";
    String lastTimeUsed = "";

    HashMap<String,String> contactTypeWithNumber=new HashMap<>();

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

        display_name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));// THIS LINE IS CAUSING EXCEPTION HERE
        lastTimeUsed = convertLongToDateFormat(phones.getString(phones.getColumnIndex(Phone.LAST_TIME_USED)));

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

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

        else
            hasPhone = "false";

        if (Boolean.parseBoolean(hasPhone)) {

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

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

            do {

                phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));

                switch (type) {

                    case 0:

                        contactType = "whatsapp";
                        break;

                    case Phone.TYPE_HOME:
                        contactType = "home";
                        break;

                    case Phone.TYPE_MOBILE:
                        contactType = "mobile";
                        break;

                    case Phone.TYPE_WORK:
                        contactType = "work";
                        break;

                    case Phone.TYPE_OTHER:
                        contactType = "other";
                        break;

                    case Phone.TYPE_WORK_PAGER:
                        contactType = "pager";
                        break;

                    case Phone.TYPE_MMS:
                        contactType = "mms";
                        break;

                    case Phone.TYPE_MAIN:
                        contactType = "main";
                        break;

                    case Phone.TYPE_FAX_HOME:
                        contactType = "fax";
                        break;

                    case Phone.TYPE_FAX_WORK:
                        contactType = "fax-home";
                        break;
                }

                if(contactList.contains(new ContactsWrapper(contactId, display_name, lookupKey, false, email_Id, lastTimeUsed,null))) {

                    try {
                        HashMap<String,String>contactTypeMapPrevious=contactList.get(contactList.size()-1).getContactTypeWithNumber();

                            if (!contactTypeMapPrevious.get(contactType).replace(" ","").equals(this.phoneNumber.replace(" ",""))) {
                                contactTypeWithNumber.put(contactType, phoneNumber);

                            }

                            else
                            {
                                if(!contactTypeWithNumber.containsKey(contactType)&& contactTypeMapPrevious.size()<=1)
                                    contactTypeWithNumber.put(contactType, phoneNumber);
                            }


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                else
                    contactTypeWithNumber.put(contactType,phoneNumber);
            }

            while (phones.moveToNext());
            contactList.add(new ContactsWrapper(contactId, display_name, lookupKey, false, email_Id, lastTimeUsed,contactTypeWithNumber));


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

        e.printStackTrace();//Cursor Out of Bound Exception here
    }

}
private void storeContactDetails(长contactId)//例如contact_id-2512
{
光标=空;
字符串[]投影=新字符串[]{
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.NUMBER,
Contacts contract.Contacts.LOOKUP_键,
Phone.HAS_Phone_号码,
电话号码,
电话。上次使用的时间
};
phones=cResolver.query(Phone.CONTENT\u URI,
投影,
Phone.CONTACT_ID+“=?”,
新字符串[]{String.valueOf(contactId)},
无效);
moveToFirst();
getResultsFromPhoneCursor(电话);
}
public void getResultsFromPhoneCursor(光标电话){
字符串email_Id=“”;
字符串contactType=“”;
字符串lastTimeUsed=“”;
HashMap contactTypeWithNumber=新HashMap();
试一试{
字符串hasPhone=“”;
显示_name=“”;
电话号码=”;
display_name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.display_name));//此行在此处导致异常
lastTimeUsed=ConvertLongtotateFormat(phones.getString(phones.getColumnIndex(Phone.LAST_TIME_USED));
hasPhone=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.HAS_Phone_NUMBER));
if(hasPhone.equalsIgnoreCase(“1”))
hasPhone=“true”;
其他的
hasPhone=“false”;
if(Boolean.parseBoolean(hasPhone)){
String lookupKey=phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
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));
}
电子邮件。关闭();
做{
phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
int type=phones.getInt(phones.getColumnIndex(Phone.type));
开关(类型){
案例0:
contactType=“whatsapp”;
打破
case Phone.TYPE_HOME:
contactType=“主页”;
打破
手机壳。手机类型:
contactType=“手机”;
打破
case Phone.TYPE_工作:
contactType=“工作”;
打破
case Phone.TYPE_其他:
contactType=“其他”;
打破
case Phone.TYPE_WORK_PAGER:
contactType=“寻呼机”;
打破
手机壳。类型\彩信:
contactType=“彩信”;
打破
case Phone.TYPE_MAIN:
contactType=“main”;
打破
case Phone.TYPE_FAX_HOME:
contactType=“传真”;
打破
案例电话。类型\传真\工作:
contactType=“传真主页”;
打破
}
if(contactList.contains(新ContactsWrapper(contactId、display\u name、lookupKey、false、email\u Id、lastTimeUsed、null))){
试一试{
HashMapcontactTypeMapPrevious=contactList.get(contactList.size()-1).getContactTypeWithNumber();
如果(!contactTypeMapPrevious.get(contactType).replace(“,”).equals(this.phoneNumber.replace(“,”)){
contactType WithNumber.put(contactType,phoneNumber);
}
其他的
{
如果(!contactTypeWithNumber.containsKey(contactType)&&contactTypeMapPrevious.size()