Android 传递联系人id以从联系人获取详细信息时获取游标IndexAutofBound异常
我根据帐户名获得一个人的联系方式,该帐户工作正常,但有姓名但没有号码的联系人除外。我也得到了这些联系人的id,但当我使用联系人id从手机光标获取详细信息时,会导致异常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
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()