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

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

Class<?> mSmsMessageClass = XposedHelpers.findClass("com.android.internal.telephony.gsm.SmsMessage", classLoader);

XposedHelpers.findAndHookMethod(mSmsMessageClass, "createFromPdu", byte[].class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param)
                            throws Throwable {
                        // TODO Auto-generated method stub
                        try {
                            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 block
                            e.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";
    //短信消息ID
    public 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;
        }
        //如果短信内容大于70
        if (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 {

    @Override
    public 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进行短信的监听。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Xposed框架是一种基于Android系统的模块化框架,它可以在不修改系统源码的情况下,通过插件方式对Android系统的各个部分进行修改和增强。通过Xposed框架,我们可以修改短信应用的功能以满足个人需求。 首先,在Xposed框架中,我们需要找到适合修改短信的模块。可能有一些第三方模块已经提供了短信功能的修改。我们可以通过Xposed框架的模块库或者其他资源渠道搜索到相应模块。在找到适合的模块后,我们可以安装并启用它。 其次,在启用了模块后,我们可以开始修改短信应用。具体的修改方式取决于所使用的模块。一般来说,我们可以通过模块的设置界面来配置短信的修改功能。例如,我们可以增加短信的过滤规则,将某些短信自动转到垃圾箱中,或者自动回复某些特定的短信。我们还可以更改短信的界面样式,增加一些个性化的功能,如修改字体颜色、背景等。这些都可以通过模块的设置来实现。 最后,在完成对短信应用的修改后,我们需要重启手机,以使Xposed框架生效。在重启后,我们可以体验修改后的短信应用功能。 总的来说,通过Xposed框架,我们可以修改短信应用的功能,增加个性化设置,满足我们对短信功能的定制需求。但是需要注意的是,使用Xposed框架修改系统功能可能存在一定的风险,如果操作不当可能导致系统不稳定或程序崩溃。因此,在进行修改前,建议备份好数据,确保有恢复的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值