在上一次,我们读取显示了短信会话列表,接下来,要继续进行的工作就是点击每个短信会话后,显示该会话包含的所有信息记录,我们还是先来看一下运行效果吧,左图为短信会话列表,右图为点击其中第二个会话之后看到的该会话下的短信记录,蓝色背景的为发出的短信,灰色背景的为收到的短信。
为了显示各个会话下所有的短信记录,需要取得短信会话的会话id,即sms表中的字段“thread_id”,而在上一篇文章中,我们已经在MessageListAdapter的getMessageSessions()方法中取得了每个短信会话的id,因此,我们还是先回去看一下吧,下面在getMessageSessions()中,红色代码部分执行了从threads表获取会话id的操作。
/**
* 从mms数据库中检索threads表
*/
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 hh:mm:ss");
Date date = new Date(Long.parseLong(sessionCursor.getString(dateColumn)));
//获得短信的各项内容
//phoneAndUnread[0]存放电话号码,phoneAndUnread[1]存放该会话中未读信息数
String threadId = sessionCursor.getString(thread_idColumn);
String phoneAndUnread[]=getPhoneNum(threadId);
String last_mms=sessionCursor.getString(snippetColumn);
//String date_mms=dateFormat.format(date);
String date_mms=date.toString();
String count_mms=sessionCursor.getString(message_countColumn);
String type = sessionCursor.getString(typeColumn);
SMSInfo smsinfo = new SMSInfo();
/*
phoneAndUnread[0]存放电话号码
*/
contact = getContactFromPhoneNum(mContext, phoneAndUnread[0]);
//获得最后的未读短信与已读短信
//String final_count="("+phoneAndUnread[1]+"/"+count_mms+")";
//将会话信息添加到信息列表中
//判断是否联系人,若为联系人显示其名称,若不是则显示号码
if (contact.getContactName().equals("")){
smsinfo.setContactMes(phoneAndUnread[0]);
}else{
smsinfo.setContactMes(contact.getContactName());
}