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

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=