android學習日記(一) 獲取某一會話的所有短信

---------------------昏割線----------------------

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就是該號碼的所有會話了

 

 

 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章