在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听

2024-01-03 12:18

本文主要是介绍在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在开发中有这样的一个需求,拦截手机中收到的所有短信进行记录,特此记录一下实现代码。

Class<?> mSmsMessageClass = XposedHelpers.findClass("com.android.internal.telephony.gsm.SmsMessage", classLoader);XposedHelpers.findAndHookMethod(mSmsMessageClass, "createFromPdu", byte[].class,new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param)throws Throwable {// TODO Auto-generated method stubtry {Object smsMessage = param.getResult();if (null != smsMessage) {String from = (String) XposedHelpers.callMethod(smsMessage, "getOriginatingAddress");String msgBody = (String) XposedHelpers.callMethod(smsMessage, "getMessageBody");XLog.e("test_sms", "收到短信---->" + "from:" + from + " msgBody:" + msgBody);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();XLog.e("SMS listen error", e.getMessage());}}});

以下为发送短信的实现代码

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;import java.util.ArrayList;/*** createTime: 2019/7/16.17:28* updateTime: 2019/7/16.17:28* author: singleMan.* desc: 发送短信的class*/public class SMSUtils {//短信发送状态public static final String SENT_SMS_ACTION = "SENT_SMS_ACTION";//短信发送结果public static final String DELIVERED_SMS_ACTION = "SMS_DELIVERED_ACTION";//目标手机号码public static final String KEY_PHONENUM = "phonenumber";//短信消息IDpublic static final String MSG_ID = "msg_id";/*** 发送短信** @param msgEntity* @return*/public static boolean SendSMS(Context context, SMSEntity msgEntity, int index) {if (null == msgEntity) {return false;}if (TextUtils.isEmpty(msgEntity.getMobile()) || TextUtils.isEmpty(msgEntity.getMsgTxt())) {return false;}//如果短信内容大于70if (msgEntity.getMsgTxt().length() > 70) {return SendLongMessage(context, msgEntity, index);}try {Intent intent = new Intent(SENT_SMS_ACTION);intent.putExtra(KEY_PHONENUM, msgEntity.getMobile());intent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pSendIntent = PendingIntent.getBroadcast(context, index, intent, PendingIntent.FLAG_ONE_SHOT);Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);deliveryIntent.putExtra(KEY_PHONENUM, msgEntity.getMobile());deliveryIntent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pDeliveryIntent = PendingIntent.getBroadcast(context, index, deliveryIntent, PendingIntent.FLAG_ONE_SHOT);android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();smsManager.sendTextMessage(msgEntity.getMobile(), null, msgEntity.getMsgTxt(), pSendIntent, pDeliveryIntent);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 内容超过70的短信将被分为两条短信进行发送* @param context* @param msgEntity* @param index* @return*/private static boolean SendLongMessage(Context context, SMSEntity msgEntity, int index) {ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();try {Intent intent = new Intent(SENT_SMS_ACTION);intent.putExtra(KEY_PHONENUM, msgEntity.getMobile());intent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pSendIntent = PendingIntent.getBroadcast(context, index, intent, PendingIntent.FLAG_ONE_SHOT);Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);deliveryIntent.putExtra(KEY_PHONENUM, msgEntity.getMobile());deliveryIntent.putExtra(MSG_ID, msgEntity.getId());PendingIntent pDeliveryIntent = PendingIntent.getBroadcast(context, index, deliveryIntent, PendingIntent.FLAG_ONE_SHOT);ArrayList<String> mSMSMessage = smsManager.divideMessage(msgEntity.getMsgTxt());for (int i = 0; i < mSMSMessage.size(); i++) {sentPendingIntents.add(i, pSendIntent);deliveredPendingIntents.add(i, pDeliveryIntent);}/* 发送SMS短信,注意倒数的两个PendingIntent参数 */smsManager.sendMultipartTextMessage(msgEntity.getMobile(), null, mSMSMessage, sentPendingIntents, deliveredPendingIntents);return true;} catch (Exception e) {e.printStackTrace();}return false;}}

附上发送方法中用到的Model类

/*** createTime: 2019/7/16.17:43* updateTime: 2019/7/16.17:43* author: singleMan.* desc: 一条短息*/public class SMSEntity {String id;String mobile;String msgTxt;public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getMsgTxt() {return msgTxt;}public void setMsgTxt(String msgTxt) {this.msgTxt = msgTxt;}public String getId() {return id;}public void setId(String id) {this.id = id;}}

接下来是在广播中监听短信的发送状态,并进行相应的处理

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.text.TextUtils;/*** createTime: 2019/7/16.17:29* updateTime: 2019/7/16.17:29* author: singleMan.* desc: 状态监听广播*/public class SmsStateListenerReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();String phoneNumber = intent.getStringExtra(SMSUtils.KEY_PHONENUM);String msgId = intent.getStringExtra(SMSUtils.MSG_ID);XLog.e("SMS-receiver", "短信的广播中心:" + action + "--->" + msgId + ":" + phoneNumber);//是否已发送if (TextUtils.equals(action, SMSUtils.SENT_SMS_ACTION)) {switch (getResultCode()) {case Activity.RESULT_OK://TODO 上报已经发送但是不确定是否成功XLog.e("SMS-receiver", "已发送");reportSendMsgStatus(msgId, true, "已发送完成");break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:case SmsManager.RESULT_ERROR_RADIO_OFF:case SmsManager.RESULT_ERROR_NULL_PDU:default://TODO 上报发送失败XLog.e("SMS-receiver", "发送失败");reportSendMsgStatus(msgId, false, "发送失败");
//                    sendMessageToView(2, msgId);break;}}//是否已送达else if (TextUtils.equals(action, SMSUtils.DELIVERED_SMS_ACTION)) {switch (getResultCode()) {case Activity.RESULT_OK://TODO 上报已经送达XLog.e("SMS-receiver", "已送达");reportSendMsgStatus(msgId, true, "短信已送达");break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:case SmsManager.RESULT_ERROR_RADIO_OFF:case SmsManager.RESULT_ERROR_NULL_PDU:default://TODO 上报未送达XLog.e("SMS-receiver", "未送达");reportSendMsgStatus(msgId, false, "短信未送达");break;}}}/*** 上报发送状态** @param taskId* @param isSuccess* @param message*/private void reportSendMsgStatus(String taskId, boolean isSuccess, String message) {//TODO 我这里执行的上报,可以根据需求进行自行修改}

记得注册广播呦 !  unRegisger的代码就不粘的,相信大家也不需要。

 /*** 注册广播*/private void registerSMSReceiver() {//注册监听短信是否成功的广播.SmsStateListenerReceiver mSMSStateListenerReceiver = new SmsStateListenerReceiver();IntentFilter mFilter = new IntentFilter();mFilter.addAction(SMSUtils.SENT_SMS_ACTION);mFilter.addAction(SMSUtils.DELIVERED_SMS_ACTION);registerReceiver(mSMSStateListenerReceiver, mFilter);}

特此记录发送短信以及监听发送状态的实现。以及通过Xposed进行短信的监听。

这篇关于在无需授权的情况下,通过Xposed实现短信的监听,附加发送短信以及发送状态监听的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565666

相关文章

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被