Android 短信会话相关

想要获取某一会话的所有短信,你首先得了解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就是该号码的所有会话了

本文出自 “jpG吃掉nova” 博客,请务必保留此出处http://jpg8nova.blog.51cto.com/4647971/988814

 

 

SmsLogList:

 

	private String name;
	private String PhoneNumber;
	private String smsbody;
	private long date;
	private String type;

//并实现GET、SET方法


 

 

以下是短信会话的相关博文地址:

http://blog.csdn.net/actual_/article/details/8060143 含彩信

http://blog.csdn.net/etzmico/article/details/6921450 短信管理的相关协议

http://www.linuxidc.com/Linux/2011-12/49588.htm 短信列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值