歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【Android】短信管理代碼

【Android】短信管理代碼

日期:2017/3/1 10:47:53   编辑:Linux編程

先貼出相關的協議:
content://sms/inbox 收件箱
content://sms/sent 已發送
content://sms/draft 草稿
content://sms/outbox 發件箱
content://sms/failed 發送失敗
content://sms/queued 待發送列表


在模擬器上Outbox沒有查詢到數據,在模擬器上找了老半天也沒找到發件箱,很郁悶。
數據庫中sms相關的字段如下:

  1. _id 一個自增字段,從1開始
  2. thread_id 序號,同一發信人的id相同
  3. address 發件人手機號碼
  4. person 聯系人列表裡的序號,陌生人為null
  5. date 發件日期
  6. protocol 協議,分為: 0 SMS_RPOTO, 1 MMS_PROTO
  7. read 是否閱讀 0未讀, 1已讀
  8. status 狀態 -1接收,0 complete, 64 pending, 128 failed
  9. type
  10. ALL = 0;
  11. INBOX = 1;
  12. SENT = 2;
  13. DRAFT = 3;
  14. OUTBOX = 4;
  15. FAILED = 5;
  16. QUEUED = 6;
  17. body 短信內容
  18. service_center 短信服務中心號碼編號
  19. subject 短信的主題
  20. reply_path_present TP-Reply-Path
  21. locked

檢索數據方法很簡單:

  1. Uri uri = Uri.parse("content://sms/inbox");
  2. Cursor cur = this.managedQuery(uri, null, null, null, null);
  3. if (cur.moveToFirst()) {
  4. do{
  5. for(int j = 0; j < cur.getColumnCount(); j++){
  6. info = "name:" + cur.getColumnName(j) + "=" + cur.getString(j);
  7. Log.i("====>", info);
  8. }
  9. }while(cur.moveToNext());
  10. }
managedQuery最終也要將參數轉換為SQL語句向SQLite發送消息,因此參數跟SQL語句很類似,所以可以在查詢字段中加入SQL函數,
比如new String[] projection = new String[]{“count(*) as count”}等等。
managedQuery中的參數依次為uri,
查詢字段 查詢字段數組,也可以將所有需要查詢的字段放入一個字符內
比如new projection[]{“_id”, “thread_id”}和new projection[]{“_id,thread_id”}是一致的。
跟SQL一樣,字段名不區分大小寫
條件 不帶Where的SQL 條件字符,如果有參數則用?替代,比如”_id=? And thread_id = ? Or type = ’1′”
條件中的參數 參數字符數組,跟上述的條件一一對應
排序 不帶Order by排序字符串,比如_id desc, type
如果參數為null,SQL中查詢字段為“*”,相關的條件為空白
還可以用getContentResolver()獲得一個ContentResolver,
getContentResolver().query()同樣返回一個Cursor對象,參數跟managedQuery一致。
不過用ContentResolver對象去更新、刪除和插入一條數據時報SecurityException。看來沒有權限,在Manifest.xml中加入權限:


然後刪除短信:
this.getContentResolver().delete(Uri.parse(“content://sms”), “_id=?”, new String[]{“3″});
刪除成功。
Url中content://sms 替換成content://sms/ 也成功,但是其它url時程序報錯,比如content://sms/inbox
看了一下Android的源代碼,sms支持的協議有:
  1. sURLMatcher.addURI("sms", null, SMS_ALL);
  2. sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
  3. sURLMatcher.addURI("sms", "inbox", SMS_INBOX);
  4. sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID);
  5. sURLMatcher.addURI("sms", "sent", SMS_SENT);
  6. sURLMatcher.addURI("sms", "sent/#", SMS_SENT_ID);
  7. sURLMatcher.addURI("sms", "draft", SMS_DRAFT);
  8. sURLMatcher.addURI("sms", "draft/#", SMS_DRAFT_ID);
  9. sURLMatcher.addURI("sms", "outbox", SMS_OUTBOX);
  10. sURLMatcher.addURI("sms", "outbox/#", SMS_OUTBOX_ID);
  11. sURLMatcher.addURI("sms", "undelivered", SMS_UNDELIVERED);
  12. sURLMatcher.addURI("sms", "failed", SMS_FAILED);
  13. sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
  14. sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
  15. sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS);
  16. sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID);
  17. sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
  18. sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
  19. sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID);
  20. sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
  21. sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
  22. sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
  23. sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
  24. sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM);
  25. sURLMatcher.addURI("sms", "sim/#", SMS_SIM);

其中,delete方法中支持的協議為:
SMS_ALL 根據參數中的條件刪除sms表數據
SMS_ALL_ID 根據_id刪除sms表數據
SMS_CONVERSATIONS_ID 根據thread_id刪除sms表數據,可以帶其它條件
SMS_RAW_MESSAGE 根據參數中的條件刪除 raw表
SMS_STATUS_PENDING 根據參數中的條件刪除 sr_pending表
SMS_SIM 從Sim卡上刪除數據
試一下SMS_CONVERSATIONS_ID:”content://sms/conversations/3 “,刪除thread_id=”3″, _id=”5″的數據
在eclipse中的Emulator Control中,以13800給模擬器發送三條數據,然後以13900發送一條
this.getContentResolver().delete(Uri.parse(“content://sms/conversations/3″), “_id=?”, new String[]{“5″});
成功刪除一條數據。
在數據庫中每個發送者的thread_id雖然一樣,但不是固定的,如果把一個發送者的全部數據刪除掉,
然後換一個新號碼發送短信時,thread_id是以數據庫中最大的id+1賦值的。
Copyright © Linux教程網 All Rights Reserved