Android 6.0删除短信、修改未读状态及静默发短信方法咨询
针对你的两个Android 6.0相关的短信操作问题,我来逐一给你梳理可行的方案:
问题1:Android 6.0中删除短信或标记短信为已读
在Android 6.0中,要操作短信(不管是删除还是修改状态),首先得搞定权限问题:你需要申请READ_SMS和WRITE_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权限,用ContentResolver的delete方法即可,可指定短信的_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




