基于Android的短信应用开发(四)——读取短信会话并显示会话联系人

           今天,我们要完成的是在短信会话主界面显示短信会话人姓名和头像,程序运行效果图如下所示:


        在前两篇文章中,我们分别试验了读取手机联系人和短信。而在读取短信记录时,还存在两个问题,第一个问题,由于我们直接从sms表读取数据,结果发现读取出来的结果并没有按联系人进行分别显示,即与每个联系人(或者是号码)的短信记录显示为一个会话,而是把所有的短信记录都显示在界面上;第二个问题,在显示短信时只显示了短信会话人的电话号码,而实际上,当会话人是手机联系人时,应该显示出该联系人的名称和头像。

        针对这两个问题,在这篇文章中给出的解决方案是:一,为了使短信分会话显示,不直接从sms表读短信,而是从threads表中读取数据,从文章——《基于Android的短信应用开发(三)》中对threads表的介绍可以知道,该表的每一条记录就对应着一个短信会话,threads表中一个id代表了一个短信会话,根据字段id可以使得读取短信按会话进行显示,将与一个联系人的短信记录都放到一个会话下面;二,为获取短信会话人的资料,我们可以进行多表联结查询,根据从threads表读取的id到sms表中查询得到对应的电话号码(sms表address字段),再由电话号码到联系人数据库中获取该联系人的名称和头像资料(在该电话号码属于手机联系人的情况下)。

        基于上面的想法,在适配器类MessageListAdapter中定义了三个新方法,分别是getMessageSessions,getPhoneNum,和getContactFromPhoneNum,这三个方法分别用于从threads表获取数据,根据threads表的id获取电话号码,和根据电话号码获取联系人名称和头像,下面来我们一起看一下这三个方法的代码。

1.getMessageSessions

<span style="font-size:14px;">public void getMessageSessions(){  
        Cursor sessionCursor = null;
        ContentResolver resolver = null;
        ContactData contact = null;
        
        try{
               Uri uri = Uri.parse(SMS_URI_ALL);
            resolver = mContext.getContentResolver();
            sessionCursor = resolver.query(uri, new String[]  
            { "* from threads--" }, null, null, null);  
            
            if (sessionCursor == null) {
                return;
            }    
            if (sessionCursor.getCount() == 0){
                sessionCursor.close();
                sessionCursor = null;
                return;
            }
              
            sessionCursor.moveToFirst();
            while (sessionCursor.isAfterLast() == false)  
            {  /*
                threads表各字段含义如下:
                1._id为会话id,他关联到sms表中的thread_id字段。
                2.recipient_ids为联系人ID,这个ID不是联系人表中的_id,而是指向表canonical_address里的id,
                canonical_address这个表同样位于mmssms.db,它映射了recipient_ids到一个电话号码,也就是说,
                最终获取联系人信息,还是得通过电话号码;
                3.mesage_count该会话的消息数量
                4.snippet为最后收到或发出的信息                
                */
                
                int thread_idColumn = sessionCursor.getColumnIndex("_id");  
                int dateColumn = sessionCursor.getColumnIndex("date");  
                int message_countColumn = sessionCursor.getColumnIndex("message_count");  
                int snippetColumn = sessionCursor.getColumnIndex("snippet");  
                int typeColumn = sessionCursor.getColumnIndex("type");
                              
                //格式化短信日期显示  
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
                Date date = new Date(Long.parseLong(sessionCursor.getString(dateColumn)));  
                //String time = dateFormat.format(date);  
                  
                 /*
                  *  获取短信的各项内容  
                  *  phoneAndUnread[0]存放电话号码,phoneAndUnread[1]存放该会话中未读信息数*/                
                //根据短信会话的threadId检索sms表,获取该短信会话人号码
                String phoneAndUnread[]=getPhoneNum(sessionCursor.getString(thread_idColumn));  
                String last_mms=sessionCursor.getString(snippetColumn);  
                String date_mms=dateFormat.format(date);  
                String count_mms=sessionCursor.getString(message_countColumn);  
                String type = sessionCursor.getString(typeColumn);
                
                SMSInfo smsinfo = new SMSInfo();
                
                /*  
                 * phoneAndUnread[0]存放电话号码
                 * 根据短信会话人号码查询手机联系人,获取会话人的名称和头像资料
                */      

                contact = getContactFromPhoneNum(mContext, phoneAndUnread[0]);                
                  
                //将会话信息添加到信息列表中
                //判断短信会话人是否为手机联系人,若为联系人显示其名称,若不是则显示号码                                 
                if (contact.getContactName().equals("")){  
                    smsinfo.setContactMes(phoneAndUnread[0]);                                        
                }else{  
                    smsinfo.setContactMes(contact.getContactName());
                }  
                
                //如果有该信息会话人头像,则设置已有头像,如果没有则给他设置一个默认的头像
                if (contact.getPhotoUri() == null){
                    smsinfo.setContactPhoto(BitmapFactory.decodeResource(
                            mContext.getResources(), R.drawable.ic_launcher));                                    
               }else{ 
                    Uri photoUri = contact.getPhotoUri();
                    InputStream input = ContactsContract.Contacts.
                            openContactPhotoInputStream(resolver, photoUri);  
                    smsinfo.setContactPhoto(BitmapFactory.decodeStream(input));
              
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值