---------------------昏割線----------------------
12月07號新增一種方法
-------------------------------------------------
想要讀取一個會話的所有信息,千言萬語就是要獲得thread_id,所以下面增加兩種獲取thread_id的方法
1.向數據庫插入一條空的短信,就可以得到thread_id了
2.關於只想搜彩信的話,改天寫
想要獲取某一會話的所有短信,你首先得了解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就是該號碼的所有會話了