在无需授权的情况下,通过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

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法