Android: 获取短信的发信人

http://kevinlynx.iteye.com/blog/845920


上次的测试,通过取得短信里的person字段,然后通过person字段从联系人表里取出联系人信息,总是存在问题:

1、如果短信是在建立联系人信息之前收到的,person字段依然是0;
2、在我的真机上即使person不为0,Cursor::moveToFirst依然失败,导致获取不出联系人信息。

今天无意看到分代码 SMS Backup,看到里面获取联系人信息的代码:
Java代码   收藏代码
  1. private PersonRecord lookupPerson(String address) {  
  2.     if (!mPeopleCache.containsKey(address)) {  
  3.         // Look phone number  
  4.         Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);  
  5.         Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,  
  6.                 nullnullnull);  
  7.         if (phoneCursor.moveToFirst()) {  
  8.             int indexPersonId = phoneCursor.getColumnIndex(Phones.PERSON_ID);  
  9.             int indexName = phoneCursor.getColumnIndex(People.NAME);  
  10.             int indexNumber = phoneCursor.getColumnIndex(Phones.NUMBER);  
  11.             long personId = phoneCursor.getLong(indexPersonId);  
  12.             String name = phoneCursor.getString(indexName);  
  13.             String number = phoneCursor.getString(indexNumber);  
  14.             phoneCursor.close();  
    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();



大概就是说android api里提供了相对简单的查询方式:
Java代码   收藏代码
  1. Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);  
  2.             Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,  
  3.                     nullnullnull);  
Uri personUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
            Cursor phoneCursor = mContext.getContentResolver().query(personUri, PHONE_PROJECTION,
                    null, null, null);

之前我也考虑过通过号码从联系人表里遍历出联系人信息,但是,这就需要自己去处理电话号码的不同表示,例如:
+86134xxxxxxxx
甚至是飞信的转发号码:12520134xxxxxxxx。

上面列的代码中,Uri大概就可以处理自动处理以上情况。不过,上面的代码已经被google标记为deprecated,查了下文档和网络资料,我写了如下的函数:
Java代码   收藏代码
  1. ContactItem getContactByAddr(Context context, final SMSItem sms) {  
  2.     Uri personUri = Uri.withAppendedPath(  
  3.             ContactsContract.PhoneLookup.CONTENT_FILTER_URI, sms.mAddress);  
  4.     Cursor cur = context.getContentResolver().query(personUri,  
  5.             new String[] { PhoneLookup.DISPLAY_NAME },  
  6.             nullnullnull );  
  7.     if( cur.moveToFirst() ) {  
  8.         int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);  
  9.         ContactItem item = new ContactItem();  
  10.         item.mName = cur.getString(nameIdx);  
  11.         cur.close();  
  12.         return item;  
  13.     }  
  14.     return null;  
  15. }  
	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;
	}

以上代码就可以通过电话号码取得联系人信息,在我的真机上也可以正确处理+86134xxxxxxxx/12520134xxxxxxxx之类的号码。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值