You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android 6.0删除短信、修改未读状态及静默发短信方法咨询

针对你的两个Android 6.0相关的短信操作问题,我来逐一给你梳理可行的方案:

问题1:Android 6.0中删除短信或标记短信为已读

在Android 6.0中,要操作短信(不管是删除还是修改状态),首先得搞定权限问题:你需要申请READ_SMSWRITE_SMS这两个危险权限,而且必须通过动态权限申请流程让用户授权,不能只在Manifest里声明。

标记短信为已读

这是相对简单的操作,你可以通过ContentResolver更新短信的status字段——短信内容提供者的URI是content://sms/,其中status=1代表已读,status=0是未读。示例代码如下:

// 假设你已经拿到了目标短信的_id
long smsId = ...;
ContentValues values = new ContentValues();
values.put("status", 1);
getContentResolver().update(
    Uri.parse("content://sms/" + smsId),
    values,
    null,
    null);

删除短信

删除短信同样需要WRITE_SMS权限,用ContentResolverdelete方法即可,可指定短信的_id或者其他筛选条件:

// 删除指定ID的短信
getContentResolver().delete(
    Uri.parse("content://sms/" + smsId),
    null,
    null);

// 或者按条件删除,比如删除某个号码的短信
getContentResolver().delete(
    Uri.parse("content://sms/"),
    "address=?",
    new String[]{"10086"});

注意:从Android 4.4开始,只有默认短信应用才能删除所有类型的短信;如果你的App不是默认短信应用,可能只能删除自己写入的短信,这点要提前考虑。

问题2:无需保存到收件箱的静默发短信方式

首先要明确一个点:SmsManager.sendTextMessage()本身不会自动把短信保存到收件箱——之所以你看到发送后收件箱里有记录,是因为系统的默认短信应用会监听SMS_SENT广播,然后把这条短信写入到短信内容提供者里。

要实现静默发送不保存,分两种情况:

  • 情况1:你的App是默认短信应用
    如果你的App被设置为系统默认短信应用,那你完全可以控制发送后的行为:在发送短信时,不要把这条短信写入content://sms/的内容提供者里,这样收件箱就不会出现这条记录。你可以直接用SmsManager发送,然后自己处理发送状态的回调,跳过写入步骤。

  • 情况2:你的App不是默认短信应用
    这种情况就比较棘手了——因为默认短信应用会自动捕获发送事件并保存短信,你没办法阻止它。虽然有些设备可能允许通过反射调用隐藏API绕过,但这种方法兼容性极差,且在Android 6.0及以上系统里,由于权限限制大概率行不通。另外,不要尝试删除刚发送的短信,因为默认短信应用写入的时机可能比你的删除操作快,会出现短信闪一下消失的糟糕体验。

总结下来,最靠谱的静默发送方式还是把你的App设为默认短信应用,然后自己控制是否保存短信。


内容的提问来源于stack exchange,提问作者AlexLother

火山引擎 最新活动