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);
}
}
猜你喜欢
- /// <summary>/// 人民币大写/// </summary>/// <param name=&qu
- 目录前言开始总结前言小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用
- 一、队列简介队列是一个有序列表,遵循“先入先出”的原则,即先存入队列的数据要先取出,后存入的数据后取出。队列有两种存储表示,顺序表示和链式表
- 先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。1、O
- 本篇超级详细案例截图教学 IDEA如何运行SpringBoot项目,图片点击可放大仔细看Java编译工具以及环境准备:IDEA JDK1.8
- 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以&
- 在Android串口通信:基本知识梳理的基础上,我结合我项目中使用串口的实例,进行总结;Android使用jni直接进行串口设备的读写网上已
- 背景我们在多模块项目开发过程中,会遇到这样的场景,工程里依赖了一个自己的或者其他同事的 aar 模块,有时候为了开发调试方便,经常会把 aa
- 多态基本概念和原理剖析多态:多态是C++面向对象的三大特性之一。多态分为静态多态和动态多态。静态多态:函数重载和运算符重载属于静态多态,复用
- 报错问题如图:仔细看报错问题后发现,这个错误的主要原因是:ValidatorException:PKIX path building fai
- 前言之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-ap
- io学习框架:文件:保存数据的地方。1)常见文件对象的相关构造器和方法:当进行File file = new File(filePath);
- WPF 之列表分页控件框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议
- 先利用jsoup将得到的html代码“标准化”(Jsoup.parse(String html))方法,然后利用FileWiter将此htm
- 在Java的6.0版本中新增了concurrent包,这个包是用作线程同步的包,提供了很多工具类。其中定时器就是其中之一。近期在做一个项目,
- 现如今打开一个 App,比如头条、微博,都会有长列表,随着我们不断地滑动,视窗内的内容也会不断地更新。今天就用 Flutter 实现一下这种
- 这里使用的是dynamic-datasource-spring-boot-starter ,它是一个基于springboot的快速集成多数据
- 本文实例为大家分享了java实现图片分割指定大小的具体代码,供大家参考,具体内容如下1.使用工具:ThumbnailsThumbnails
- Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再
- 本文实例讲述了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,在项目开发中有一定的实用价值,具体方法如下:一、前言