-
content://sms/
所有短信的URI -
content://sms/88
指定id的URI- 删除某条短信,会触发URI的回调
-
content://sms/inbox
收件箱的所有短信(不包含发送的) -
content://sms/conversations/1
指定会话(某个联系人)的所有收发短信 -
content://sms/status/88
指定id的送达状态监听URI -
content://sms?in_blocked_wl=true&in_private_wl=true
短信记录的字段说明
- _id: 主键
- thread_id: 会话id,同一聊天对象处于同一个会话列表中,此字段即是标记当前会话列表的id
- address:收件人的号码
- status: 短信状态,default-1 -1:接收/保存草稿箱,0:完成,32:发出 64:等待, 128:失败
- type: 类型,1接收 2 发出 3:草稿 4:发件箱 5:失败 6:排队
- body: 短信内容
- sim_id:发送当前短信的SIM卡的id,即在
content://telephony/siminfo
表中的主键 - date: 短信记录发生的时间
_id=20
thread_id=5
address=1851006****eF8dE0__9OaYcxtZwan2K
person=null
date=1554973055654
date_sent=1554973019000
protocol=0
read=1
status=-1
type=1
reply_path_present=0
subject=null
body=不不不不将就
service_center=null
locked=0
error_code=0
seen=1
timed=0
deleted=0
sync_state=2
marker=102876701341068800
source=NDUzNDgwMTYwNzA4ODU0NDA6MDo1MGQ0YzA4MTMwMGIwMzUwOWQyNzAxOTRmN2QwNTc3YjoxNTU0OTczMDU1NjU0
bind_id=45348016070885440
mx_status=0
mx_id=null
mx_id_v2=null
out_time=0
account=2223689376
sim_id=1
block_type=0
advanced_seen=3
b2c_ttl=0
b2c_numbers=null
fake_cell_type=0
url_risky_type=0
creator=null
favorite_date=0
会话 conversations
获取所有会话,并删除
val cursor = resolver.query(Uri.parse("content://sms/conversations/"), null, null, null, "date desc")
?: return
Logs.d("clearSms: count ${cursor.count}")
while (cursor.moveToNext()) {
Logs.i("clearSms: =============start===========")
for (i in 0 until cursor.columnCount){
val columnName = cursor.getColumnName(i)
val value = cursor.getString(i)
Logs.d("clearSms: $columnName=$value")
}
Logs.i("clearSms: =============end===========")
}
cursor.close()
当不知道会包含什么字段时,可以通过此方法来遍历获取
snippet=对不起,您发送的指令或号码不正确,请核对后重新发送。
thread_id=3
msg_count=8
conversations Uri 对应返回的字段
thread_id
:当前会话的id
msg_count
: 当前会话包含多少消息
snippet
: 当前会话的一条消息内容(一般是最近的一条内容展示)
删除短信的操作 以及设置默认短信程序
Android 4.4 之后,系统只允许默认的短信应用,可以删除等写入短信的操作
设置默认短信程序
- 弹框提示
val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
startActivity(intent)
此种方式是由系统提供的交互方式用以更改默认短信程序。但是在MIUI系统中把这个弹框的可选项交互给去掉了,只允许选择系统短信程序,也就是说 即使弹框了,也只能选择默认的系统短信应用。
- 反射方式
try {
val clazz = Class.forName("com.android.internal.telephony.SmsApplication")
val method = clazz.getMethod("setDefaultApplication", String::class.java, Context::class.java)
method.invoke(null, packageName, this)
} catch (e: Exception) {
e.printStackTrace()
}
此方式会出现反射调用失败的case,即系统层限制了反射的调用,结果仍然是失败的。即:无法修改默认短信程序。
网友评论