想要獲取某一會話的所有短信,你首先得了解android系統存儲短信的結構,網上有很多介紹
sms主要結構:
- _id => 短消息序號 如100
- thread_id => 對話的序號 如100
- address => 發件人地址,手機號.如+8613811810000
- person => 發件人,返回一個數字就是聯繫人列表裏的序號,陌生人爲null
- date => 日期 long型。如1256539465022
- protocol => 協議 0 SMS_RPOTO, 1 MMS_PROTO
- read => 是否閱讀 0未讀, 1已讀
- status => 狀態 -1接收,0 complete, 64 pending, 128 failed
- type => 類型 1是接收到的,2是已發出 (6是等待發送)
- body => 短消息內容
- service_center => 短信服務中心號碼編號。如+8613800755500
看到第二項,很明顯,想要獲取某一會話的所有信息,必須先得到thread_id這個東西才行
那我們就先寫一個獲取thread_id的函數吧,傳入參數是會話中,對方的電話號碼
- /**
- * 全局變量
- */
- final String SMS_URI_ALL = "content://sms/";
- final String SMS_URI_INBOX = "content://sms/inbox";
- final String SMS_URI_SEND = "content://sms/sent";
- final String SMS_URI_DRAFT = "content://sms/draft";
- final Uri URI = Uri.parse(SMS_URI_ALL);
- final String ADDRESS = "address";
- final String THREAD_ID = "thread_id";
函數體
- int getThreadId(String number) {
- int threadId=0;
- //根據電話號碼去搜索
- ContentResolver cr = context.getContentResolver();
- String[] projection = new String[] { THREAD_ID, ADDRESS };
- Cursor cur = cr.query(URI, projection, ADDRESS + " = ?",
- new String[] { number }, null);// asc
- int threadIdColumn = cur.getColumnIndex(THREAD_ID);
- if (cur != null) {
- while (cur.moveToNext()) {
- //獲得會話的thread_id
- threadId = cur.getInt(threadIdColumn);
- Log.v("smsLog", "thread id=" + threadId);
- }
- cur.close();
- }
- return threadId;
- }
然後是根據該thread_id去搜索所有短信
函數體
- public List<SmsLogList> getSmsInPhone(String number) {
- int thread_id = getThreadId(number);
- sms_list = new ArrayList<SmsLogList>();
- //獲得短信_id 號碼 人名 短信內容 時間 和 類型
- String[] projection = new String[] { "_id", ADDRESS, "person", "body",
- "date", "type" };
- ContentResolver cr = context.getContentResolver();
- Cursor cur = cr.query(URI, projection, THREAD_ID + " = ?",
- new String[] { Integer.toString(thread_id) }, "date desc");
- int nameFieldColumnIndex = cur.getColumnIndex("person");
- int numberFieldColumnIndex = cur.getColumnIndex(ADDRESS);
- int smsbodyColumn = cur.getColumnIndex("body");
- int dateColumn = cur.getColumnIndex("date");
- int typeColumn = cur.getColumnIndex("type");
- if (cur != null) {
- while (cur.moveToNext()) {
- SmsLogList smsLogList = new SmsLogList();
- smsLogList.setName(cur.getString(nameFieldColumnIndex));
- smsLogList
- .setPhoneNumber(cur.getString(numberFieldColumnIndex));
- smsLogList.setSmsbody(cur.getString(smsbodyColumn));
- smsLogList.setDate(cur.getLong(dateColumn));
- smsLogList.setType(cur.getString(typeColumn));
- Log.v("smsLog", "setType=" + cur.getString(typeColumn) + " "
- + number);
- sms_list.add(smsLogList);
- }
- cur.close();
- }
- return sms_list;
- }
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 短信管理的相關協議