---------------------昏割线----------------------

12月07号新增一种方法

-------------------------------------------------

 

想要读取一个会话的所有信息,千言万语就是要获得thread_id,所以下面增加两种获取thread_id的方法

1.向数据库插入一条空的短信,就可以得到thread_id了

2.关于只想搜彩信的话,改天写

 

 

 

想要获取某一会话的所有短信,你首先得了解android系统存储短信的结构,网上有很多介绍

sms主要结构: 

 
  1. _id => 短消息序号 如100  
  2. thread_id => 对话的序号 如100  
  3. address => 发件人地址,手机号.如+8613811810000  
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否阅读 0未读, 1已读   
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 类型 1是接收到的,2是已发出  (6是等待发送) 
  10. body => 短消息内容   
  11. service_center => 短信服务中心号码编号。如+8613800755500  

 

看到第二项,很明显,想要获取某一会话的所有信息,必须先得到thread_id这个东西才行

那我们就先写一个获取thread_id的函数吧,传入参数是会话中,对方的电话号码

 

 
   
  1.  /** 
  2.  * 全局变量 
  3.  */ 
  4. final String SMS_URI_ALL = "content://sms/"
  5. final String SMS_URI_INBOX = "content://sms/inbox"
  6. final String SMS_URI_SEND = "content://sms/sent"
  7. final String SMS_URI_DRAFT = "content://sms/draft"
  8. final Uri URI = Uri.parse(SMS_URI_ALL); 
  9. final String ADDRESS = "address"
  10. final String THREAD_ID = "thread_id"

函数体

 
   
  1. int getThreadId(String number) { 
  2.     int threadId=0
  3.     //根据电话号码去搜索 
  4.     ContentResolver cr = context.getContentResolver(); 
  5.     String[] projection = new String[] { THREAD_ID, ADDRESS }; 
  6.  
  7.     Cursor cur = cr.query(URI, projection, ADDRESS + " = ?", 
  8.             new String[] { number }, null);// asc 
  9.  
  10.     int threadIdColumn = cur.getColumnIndex(THREAD_ID); 
  11.     if (cur != null) { 
  12.  
  13.         while (cur.moveToNext()) { 
  14.             //获得会话的thread_id 
  15.             threadId = cur.getInt(threadIdColumn); 
  16.             Log.v("smsLog", "thread id=" + threadId); 
  17.         } 
  18.         cur.close(); 
  19.     } 
  20.  
  21.     return threadId; 
  22.  

然后是根据该thread_id去搜索所有短信

函数体

 

 
   
  1. public List<SmsLogList> getSmsInPhone(String number) { 
  2.         int thread_id = getThreadId(number); 
  3.         sms_list = new ArrayList<SmsLogList>(); 
  4. //获得短信_id 号码 人名 短信内容 时间 和 类型
  5.         String[] projection = new String[] { "_id", ADDRESS, "person", "body", 
  6.                 "date", "type" }; 
  7.         ContentResolver cr = context.getContentResolver(); 
  8.         Cursor cur = cr.query(URI, projection, THREAD_ID + " = ?", 
  9.                 new String[] { Integer.toString(thread_id) }, "date desc"); 
  10.  
  11.         int nameFieldColumnIndex = cur.getColumnIndex("person"); 
  12.         int numberFieldColumnIndex = cur.getColumnIndex(ADDRESS); 
  13.         int smsbodyColumn = cur.getColumnIndex("body"); 
  14.         int dateColumn = cur.getColumnIndex("date"); 
  15.         int typeColumn = cur.getColumnIndex("type"); 
  16.         if (cur != null) { 
  17.  
  18.             while (cur.moveToNext()) { 
  19.                 SmsLogList smsLogList = new SmsLogList(); 
  20.                 smsLogList.setName(cur.getString(nameFieldColumnIndex)); 
  21.                 smsLogList 
  22.                         .setPhoneNumber(cur.getString(numberFieldColumnIndex)); 
  23.                 smsLogList.setSmsbody(cur.getString(smsbodyColumn)); 
  24.                 smsLogList.setDate(cur.getLong(dateColumn)); 
  25.                 smsLogList.setType(cur.getString(typeColumn)); 
  26.                 Log.v("smsLog", "setType=" + cur.getString(typeColumn) + "  " 
  27.                         + number); 
  28.                 sms_list.add(smsLogList); 
  29.             } 
  30.             cur.close(); 
  31.         } 
  32.         return sms_list; 
  33.     } 

SmsLogList 是一个类,封装了短信的内容,你们可以自己建一个


返回的list就是该号码的所有会话了