android:name="android.permission.READ_SMS"/> android:name="android.permission.WRITE_SMS" /> android:name="android.permission.R">

android 是否有短信权限,Android 短信相关的权限和支持的短信协议

🏷️ 365betvip 📅 2025-08-15 23:16:48 👤 admin 👀 5711 ⭐ 62
android 是否有短信权限,Android 短信相关的权限和支持的短信协议

短信相关权限

android:name="android.permission.SEND_SMS"/>

android:name="android.permission.READ_SMS"/>

android:name="android.permission.WRITE_SMS" />

android: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 = new

ContentValues(); 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 = new

ContentValues(); 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?

相关推荐 ✨