Android项目实现短信的发送、接收和对短信进行拦截
作者:Q-WHai 发布时间:2021-06-14 06:59:26
说实话,关于Android中对短信的一些相关操作是一个比较入门的东西。那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Android系统的短信进行其他学习的时候也就放在这里做一个记录了,于是就写了这篇啰嗦的文章。如果你觉得这是一个不错的东西,欢迎收藏,以便在以后更方便地查看本人在此篇文章中更新的内容。下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习。
短信的发送
由于Android中对短信发送方法的优良封装,之后对发送短信的开发就显得异常的简单了。
public static void sendMessage(Context context, String content, String phoneNumber) {
SmsManager sms = SmsManager.getDefault();
PendingIntent pi = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
sms.sendTextMessage(phoneNumber, null, content, pi, null);
}
别忘了还有权限问题:
<uses-permission android:name="android.permission.SEND_SMS" />
短信的接收
对于短信息的接收相对来说会复杂一些。而复杂的原因大家也应该比较容易理解——接收是不可控制的。也就是说我们的手机根本不知道什么时候会有一条短信息过来。由于过于被动,Android的机制中就出现了一个强大到让你佩服的东西,那就是广播接收者。我们注册一个广播接收者,然后让这个广播接收者时时刻刻地去监听短信息是否到达的这一事件。就这样,被动触发事件完美地解决了。下面让我们来看看这个过程:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
}
showToast(context, "短信内容: " + smsMessage[0].getMessageBody());
}
}
添加权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
以及在manifest中进行一个静态注册:
<receiver android:name=".broadcast.SMSReceiver" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
短信的拦截
在能够接收短信的基础上做一个短信拦截倒是简单了许多。因为能够接收,所以我只要成为第一个接收的人,并把接收到的短信不再向下传播,这就完成了短信息的拦截了。
提高优先权:
阻断传播:
短信的删除
以下是短信相关的协议
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
就拿收件箱为例实现短信的删除代码如下:
实现删除短信中包含某一字段的短信:
public void deleteSMS(String smscontent) {
ContentResolver CR = getContentResolver();
try {
// 准备系统短信收信箱的uri地址
Uri uri = Uri.parse("content://sms/inbox");
// 查询收信箱里所有的短信
Cursor cursor = CR.query(uri, new String[] { "_id", "address", "person", "body", "date", "type" }, null, null, null);
int count = cursor.getCount();
if (count > 0) {
while (cursor.moveToNext()) {
String body = cursor.getString(cursor.getColumnIndex("body"));// 获取信息内容
if (body.contains(smscontent)) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
CR.delete(Uri.parse("content://sms"), "_id=" + id, null);
}
}
}
} catch (Exception e) {
Log.v("e", e.getMessage());
}
}
根据最新的短信实现删除信息(删除的对象是联系人而非短信)
public void deleteSMS() {
ContentResolver CR = getContentResolver();
// 查询收信箱里所有的短信
Cursor cursor = CR.query(Uri.parse("content://sms/inbox"), new String[] { "_id", "thread_id" }, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
int a = cursor.getCount();
int b = cursor.getColumnCount();
long threadId = cursor.getLong(1);
CR.delete(Uri.parse("content://sms/conversations/" + threadId), null, null);
}
}


猜你喜欢
- 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。基本原理通用 Mapper 提供了一些通用的方法,这些通用方
- Mybatis映射文件mapper.xml的注释问题从昨天夜晚9点到今天中午,一直被项目bug所困惑,中间这段时间一直未解决这个问题,也咨询
- 前言在系统运行过程中,可能由于一些配置项的简单变动需要重新打包启停项目,这对于在运行中的项目会造成数据丢失,客户操作无响应等情况发生,针对这
- 本篇文章基于redisson-3.17.6版本源码进行分析一、主从redis架构中分布式锁存在的问题1、线程A从主redis中请求一个分布式
- foreach 循环 list(map)直接上代码:整体需求就是1.分页对象里面有map map里面又有数组对象2.分页对象里面有list
- C# 日历类的实现代码,具体如下所示:using System;namespace DotNet.Utilities{ ///
- 我们知道Android手机操作系统采用的是Linux内核,Linux中最高的系统权限就是Root,这就类似与Windows中的Adminis
- 一、简述首先,Java 8引入了java.time.LocalDate来表示一个没有时间的日期。其次,使用Java 8版本,还需要更新jav
- 本文实例为大家分享了RecyclerView实现侧滑拖拽功能的具体代码,供大家参考,具体内容如下准备ItemDragListenerpack
- 具体详细介绍请看下文:在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Common
- ps: 不想看代码的滑到最下面有apk包百度网盘下载地址1. 先看效果图 不然都是耍流氓2.项目目录3.一些配置build.gradlepl
- 在这篇文章中,我精选了几个比较适合 Java 编码的 IDEA 主题供小伙伴们选择。另外,我自己用的是 One Dark theme 这款。
- 本文实例为大家分享了C#实现简单串口通讯的具体代码,供大家参考,具体内容如下参数设置界面代码:using System;using Syst
- 一、Json简介Json(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JS的一个子集。 Jso
- 1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android
- 前言我相信很多Android开发同学都遇到过这样的需求: 1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.
- 最近在学ssh,一直搞不懂$,%,#的区别,做了点小练习,慢慢也懂了一点,将自己所学的也记录下来吧。 存在一下一个实
- ListView的多种样式条目展示这里给大家介绍一下简单的ListView的多种样式展示在布局文件中和往常一样写一个ListViwe的布局
- 背景两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),n
- 这周在做公司的一个C#项目中,要写一个webservice提供一个下载方法,之前公司有过,但是要整改,于是这种鸟屎摊子又交给了我,其中一个密