【Android】短信管理代码


先贴出相关的协议:
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赋值的。
  • 1
  • 2
  • 下一页

相关内容