Android 短信相关的权限和支持的短信协议

来源:互联网 发布:性知识软件哪些好 编辑:程序博客网 时间:2024/05/19 19:29

Android 短信相关的权限和支持的短信协议

短信相关权限
<!-- 
发送消息-->
<uses-permissionandroid:name="android.permission.SEND_SMS"/>
<!-- 
阅读消息-->
<uses-permissionandroid:name="android.permission.READ_SMS"/>
<!-- 
写入消息-->
<uses-permissionandroid:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
 

系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db 
但真机不可读

URI:content://mms-sms/conversations 相关重要列
thread_id:这个字段很重要,同一个会话中他们的thread_id是一样的,也就是说通过thread_id就可以知道A与B在聊天 还是A与C在聊天
date :这条消息发送或接收的时间
read: 
0 表示未读 1表示已读
type : 1表示接收 2 表示发出
body 
表示 消息的内容

 

SMS不能直接访问数据库,只能通过协议来访问数据,相关的协议:      
content://sms/inbox 
      收件箱
content://sms/sent 
      已发送
content://sms/draft 
      草稿
content://sms/outbox 
      发件箱
content://sms/failed 
      发送失败
content://sms/queued 
      待发送列表


在模拟器上Outbox可能没有数据。
数据库中sms相关的字段如下: 
 
_id 
             一个自增字段,从1开始
thread_id 
  序号,同一发信人的id相同
address 
    发件人手机号码
person 
      联系人列表里的序号,陌生人为null(不一定有联系人就有值)
date 
          发件日期
protocol 
    协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO
read 
         是否阅读 0未读, 1已读
status 
       状态 -1接收,0 complete, 64 pending, 128 failed
type
 
  ALL    =0;
 
  INBOX  = 1;
 
  SENT   = 2;
 
  DRAFT  = 3;
 
   OUTBOX =4;
 
   FAILED =5;
 
   QUEUED =6;
body 
                   短信内容
service_center 
   短信服务中心号码编号
subject 
                短信的主题
reply_path_present 
   TP-Reply-Path
locked 
  是否加锁

/////////////////////////////////////////////////////////////////////


android的源代码,sms支持的协议有:
sURLMatcher.addURI("sms", null, SMS_ALL);
sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
sURLMatcher.addURI("sms", "inbox", SMS_INBOX);
sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID);
sURLMatcher.addURI("sms", "sent", SMS_SENT);
sURLMatcher.addURI("sms", "sent/#", SMS_SENT_ID);
sURLMatcher.addURI("sms", "draft", SMS_DRAFT);
sURLMatcher.addURI("sms", "draft/#", SMS_DRAFT_ID);
sURLMatcher.addURI("sms", "outbox", SMS_OUTBOX);
sURLMatcher.addURI("sms", "outbox/#", SMS_OUTBOX_ID);
sURLMatcher.addURI("sms", "undelivered", SMS_UNDELIVERED);
sURLMatcher.addURI("sms", "failed", SMS_FAILED);
sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
sURLMatcher.addURI("sms", "conversations",SMS_CONVERSATIONS);
sURLMatcher.addURI("sms", "conversations/*",SMS_CONVERSATIONS_ID);
sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
sURLMatcher.addURI("sms", "attachments/#",SMS_ATTACHMENT_ID);
sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM);
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卡上删除数据

//删除thread_id="3", _id="5"的数据
//SMS_CONVERSATIONS_ID:"content://sms/conversations/3"
this.getContentResolver().delete(Uri.parse("content://sms/conversations/3"),"_id=?", new String[]{"5"});
在数据库中每个发送者的thread_id虽然一样,但不是固定的,如果把一个发送者的全部数据删除掉,
然后换一个新号码发送短信时,thread_id是以数据库中最大的id+1赋值的。

/////////////////////////////////////////////////////////////////////

update支持的协议有很多:

SMS_RAW_MESSAGE  
SMS_STATUS_PENDING 
 
SMS_ALL 
 
SMS_FAILED 
 
SMS_QUEUED 
 
SMS_INBOX 
 
SMS_SENT 
 
SMS_DRAFT 
 
SMS_OUTBOX 
 
SMS_CONVERSATIONS 
 
SMS_ALL_ID 
 
SMS_INBOX_ID 
 
SMS_FAILED_ID 
 
SMS_SENT_ID 
 
SMS_DRAFT_ID 
 
SMS_OUTBOX_ID 
 
SMS_CONVERSATIONS_ID 
 
SMS_STATUS_ID

SMS_INBOX_ID测试:  
ContentValues cv = newContentValues(); 
 
cv.put("thread_id", "2"); 
 
cv.put("address","00000"); 
 
cv.put("person", "11"); 
 
cv.put("date","11111111"); 
 
this.getContentResolver().update(Uri.parse("content://sms/inbox/4"),cv, null,null); 
  
可以更新thread_id(但有可能混乱)


/////////////////////////////////////////////////////////////////////
insert支持的协议:

SMS_ALL  
SMS_INBOX 
 
SMS_FAILED 
 
SMS_QUEUED 
 
SMS_SENT 
 
SMS_DRAFT 
 
SMS_OUTBOX 
 
SMS_RAW_MESSAGE 
 
SMS_STATUS_PENDING 
 
SMS_ATTACHMENT 
 
SMS_NEW_THREAD_ID

向sms表插入数据时,type是根据协议来自动设置,  
如果传入的数据中没有设置date时,自动设置为当前系统时间;非SMS_INBOX协议时,read标志设置为1 
 
SMS_INBOX协议时,系统会自动查询并设置PERSON 
 
threadId为null或者0时,系统也会自动设置 
 

一直为造不了"发送失败"的邮件而发愁,现在来做一个:  
content://sms/failed

ContentValues cv = newContentValues();  
cv.put("_id", "99"); 
 
cv.put("thread_id", "0"); 
 
cv.put("address","9999"); 
 
cv.put("person", "888"); 
 
cv.put("date", "9999");
cv.put("protocol", "0");
cv.put("read", "1");
cv.put("status", "-1");
//cv.put("type", "0");
cv.put("body", "短信内容");
this.getContentResolver().insert(Uri.parse("content://sms/failed"),cv);
//插入短信是否设置了检验?
type
 
  ALL    =0;
 
  INBOX  = 1;
 
  SENT   = 2;
 
  DRAFT  = 3;
 
   OUTBOX =4;
 
   FAILED =5;
 
   QUEUED =6;
type是否被设置成了5?

1 0
原创粉丝点击