既[url=http://kevinlynx.iteye.com/blog/843281]上次的测试[/url],通过取得短信里的person字段,然后通过person字段从联系人表里取出联系人信息,总是存在问题:
1、如果短信是在建立联系人信息之前收到的,person字段依然是0;
2、在我的真机上即使person不为0,Cursor::moveToFirst依然失败,导致获取不出联系人信息。
今天无意看到分代码[url=http://code.google.com/p/android-sms]SMS Backup[/url],看到里面获取联系人信息的代码:
[code]
private PersonRecord lookupPerson(String address) {
if (!mPeopleCache.containsKey(address)) {
// Look phone number
Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,
null, null, null);
if (phoneCursor.moveToFirst()) {
int indexPersonId = phoneCursor.getColumnIndex(Phones.PERSON_ID);
int indexName = phoneCursor.getColumnIndex(People.NAME);
int indexNumber = phoneCursor.getColumnIndex(Phones.NUMBER);
long personId = phoneCursor.getLong(indexPersonId);
String name = phoneCursor.getString(indexName);
String number = phoneCursor.getString(indexNumber);
phoneCursor.close();
[/code]
大概就是说android api里提供了相对简单的查询方式:
[code]
Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,
null, null, null);
[/code]
之前我也考虑过通过号码从联系人表里遍历出联系人信息,但是,这就需要自己去处理电话号码的不同表示,例如:
+86134xxxxxxxx
甚至是飞信的转发号码:12520134xxxxxxxx。
上面列的代码中,Uri大概就可以处理自动处理以上情况。不过,上面的代码已经被google标记为deprecated,查了下文档和网络资料,我写了如下的函数:
[code]
ContactItem getContactByAddr(Context context, final SMSItem sms) {
Uri personUri = Uri.withAppendedPath(
ContactsContract.PhoneLookup.CONTENT_FILTER_URI, sms.mAddress);
Cursor cur = context.getContentResolver().query(personUri,
new String[] { PhoneLookup.DISPLAY_NAME },
null, null, null );
if( cur.moveToFirst() ) {
int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
ContactItem item = new ContactItem();
item.mName = cur.getString(nameIdx);
cur.close();
return item;
}
return null;
}
[/code]
以上代码就可以通过电话号码取得联系人信息,在我的真机上也可以正确处理+86134xxxxxxxx/12520134xxxxxxxx之类的号码。
1、如果短信是在建立联系人信息之前收到的,person字段依然是0;
2、在我的真机上即使person不为0,Cursor::moveToFirst依然失败,导致获取不出联系人信息。
今天无意看到分代码[url=http://code.google.com/p/android-sms]SMS Backup[/url],看到里面获取联系人信息的代码:
[code]
private PersonRecord lookupPerson(String address) {
if (!mPeopleCache.containsKey(address)) {
// Look phone number
Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,
null, null, null);
if (phoneCursor.moveToFirst()) {
int indexPersonId = phoneCursor.getColumnIndex(Phones.PERSON_ID);
int indexName = phoneCursor.getColumnIndex(People.NAME);
int indexNumber = phoneCursor.getColumnIndex(Phones.NUMBER);
long personId = phoneCursor.getLong(indexPersonId);
String name = phoneCursor.getString(indexName);
String number = phoneCursor.getString(indexNumber);
phoneCursor.close();
[/code]
大概就是说android api里提供了相对简单的查询方式:
[code]
Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,
null, null, null);
[/code]
之前我也考虑过通过号码从联系人表里遍历出联系人信息,但是,这就需要自己去处理电话号码的不同表示,例如:
+86134xxxxxxxx
甚至是飞信的转发号码:12520134xxxxxxxx。
上面列的代码中,Uri大概就可以处理自动处理以上情况。不过,上面的代码已经被google标记为deprecated,查了下文档和网络资料,我写了如下的函数:
[code]
ContactItem getContactByAddr(Context context, final SMSItem sms) {
Uri personUri = Uri.withAppendedPath(
ContactsContract.PhoneLookup.CONTENT_FILTER_URI, sms.mAddress);
Cursor cur = context.getContentResolver().query(personUri,
new String[] { PhoneLookup.DISPLAY_NAME },
null, null, null );
if( cur.moveToFirst() ) {
int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
ContactItem item = new ContactItem();
item.mName = cur.getString(nameIdx);
cur.close();
return item;
}
return null;
}
[/code]
以上代码就可以通过电话号码取得联系人信息,在我的真机上也可以正确处理+86134xxxxxxxx/12520134xxxxxxxx之类的号码。