Autojs后台静默发短信

描述

唉, 安卓代码转成autojs使用的代码,有些代码的转换真的是蛋疼的很,一个小小的问题.折腾了我三天,到处翻资料, 到头来答案却在眼皮子上挂着...不说了,丢人...

想要使用autojs在后台静默发送短信很简单,简简单单一句代码就搞定,但是还得需要判断是否发送成功了, 对方是否接收成功了等等问题.

//Autojs Code:
importClass(android.telephony.gsm.SmsManager);
SmsManager.getDefault().sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);

说一下各个参数的意义: 以实际传的参数来说明,只说作用,不说官方解释

phoneNumber : 就是接收短信的手机号码, string类型,

null : 短信服务中心号码, 默认null,

msg : 短信内容, 因为是sendTextMessage,所以这个参数是string类型,

sentPI : 发送时要触发的intent,

deliverPI : 对方接收到短信所触发的intent

要判断是否发送成功和接收成功,就需要注册两个广播的监听.来得到结果.下面分别记录一下免费版Autojs和AutojsPro8.0以上的版本如何注册一个监听.

免费版注册监听的方式

/**
 * 免费版autojs注册监听
 */
var sendMessageFilter=new IntentFilter();
sendMessageFilter.addAction(SENT_SMS_ACTION);
var sendMessage = new JavaAdapter(android.content.BroadcastReceiver, {
    onReceive : function(context, intent) {
        let phone = intent.getStringExtra("KEY_PHONENUM");
        let message = intent.getStringExtra("KEY_MESSAGE");
        switch (sendMessage.getResultCode()) {
            case Activity.RESULT_OK:
                console.log("给手机号码: " + phone + " 发送短信成功");
                console.log("发送的内容: " + message);
                break;
            default:
                console.log("给手机号码: " + phone + " 发送短信成功");
                break;
        }
    }
});
context.registerReceiver(sendMessage,sendMessageFilter);


var receiverFilter=new IntentFilter();
receiverFilter.addAction(DELIVERED_SMS_ACTION);
var receiver = new JavaAdapter(android.content.BroadcastReceiver, {
    onReceive : function(context, intent) {
        let phone = intent.getStringExtra("KEY_PHONENUM");
        console.log("手机号: " + phone + " 接收短信成功");
    }
});
context.registerReceiver(receiver, receiverFilter);

以下是Pro8.0以后的版本注册监听的方式:

/**
 * autojsPro 8.0以上的版本使用的监听
 */
 //发送短信的监听
let sendMessage = new BroadcastReceiver(function(ctx, intent) {
    let phone = intent.getStringExtra("KEY_PHONENUM");
    let message = intent.getStringExtra("KEY_MESSAGE");
    switch (sendMessage.getResultCode()) {
        case Activity.RESULT_OK:
            console.log("给手机号码: " + phone + " 发送短信成功");
            console.log("发送的内容: " + message);
            break;
        default:
            console.log("给手机号码: " + phone + " 发送短信成功");
            break;
    }
});
context.registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));


//对方接收短信的监听
let receiver = new BroadcastReceiver(function(ctx, intent) {
    let phone = intent.getStringExtra("KEY_PHONENUM");
    console.log("手机号: " + phone + " 接收短信成功");
});
context.registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));

监听的注册, 自己根据当前手机所使用的的Autojs版本自己选择,或者自己做成一个函数判断后再注册.

快要下班了, 我还是直接通过整个脚本来讲解其他的吧!

importPackage(android.content);


importClass(android.telephony.gsm.SmsManager);
importClass(android.app.PendingIntent);
importClass(android.app.Activity)


//监听脚本的结束事件,结束后,注销两个监听,否则会一直再后台监听着...
events.on("exit", () => {
    context.unregisterReceiver(receiver);
    context.unregisterReceiver(sendMessage);
});


/**发送与接收的广播**/
const SENT_SMS_ACTION = "SENT_SMS_ACTION";
const DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";


//这里先注册两个监听,一个是发短信成功后的监听, 一个是对方接收短信成功
//的监听,短信发送失败后的逻辑可以写在这里.
let sendMessage = new BroadcastReceiver(function(ctx, intent) {
    let phone = intent.getStringExtra("KEY_PHONENUM");
    let message = intent.getStringExtra("KEY_MESSAGE");
    switch (sendMessage.getResultCode()) {
        case Activity.RESULT_OK:
            console.log("给手机号码: " + phone + " 发送短信成功");
            console.log("发送的内容: " + message);
            break;
        default:
            console.log("给手机号码: " + phone + " 发送短信成功");
            break;
    }
});
context.registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));


let receiver = new BroadcastReceiver(function(ctx, intent) {
    let phone = intent.getStringExtra("KEY_PHONENUM");
    console.log("手机号: " + phone + " 接收短信成功");
});
context.registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));


var phoneArray = ["电话号码", "电话号码"];
for (let i in phoneArray) {
    sendMessages(phoneArray[i], "今天也是元气满满的一天呢!!!", i);
    sleep(100);
}
//保持脚本持续运行,不会提前注销监听事件. 代码执行完自己手动结束脚本.
//这里我没优化的更人性化一些...
while (true) {
    // sendMessages("10010", "也是元气满满的一天呢!!!");
    sleep(60 * 1000);
}


/**
 * 发短信的函数
 * @param {string} phoneNumber  手机号码
 * @param {string} message      要发送的文字短信
 * @param {int} rescode         短信广播的标识,只要是个int类型的数字即可,每条短信使用不同的标识号,确保监听可以正确识别
 */
function sendMessages(phoneNumber, message, rescode) {
    let sms = SmsManager.getDefault();


    let sentIntent = new Intent(SENT_SMS_ACTION);
        sentIntent.putExtra("KEY_PHONENUM", phoneNumber);
        sentIntent.putExtra("KEY_MESSAGE", message);
    //这里需要说一下: rescode是广播标识,用来区分不同手机号的短信,
    //PendingIntent.FLAG_ONE_SHOT 这个是说,该广播只使用一次.再有相同的rescode标识的广播被接收到时,不做处理.
    let sentPI = PendingIntent.getBroadcast(context, rescode, sentIntent, PendingIntent.FLAG_ONE_SHOT);
    // log("sentPI : " + sentPI);


    let deliverIntent = new Intent(DELIVERED_SMS_ACTION);
        deliverIntent.putExtra("KEY_PHONENUM", phoneNumber);
    let deliverPI = PendingIntent.getBroadcast(context, rescode, deliverIntent, PendingIntent.FLAG_ONE_SHOT);
    // log("deliverPI : " + deliverPI);

    /**
     * 这里是判断短信内容如果大于70个字, 就需要分两条或者多条短信发送出去.
     */
    if (message.length > 70) {
        let msgs = sms.divideMessage(message);
        for (let i in msgs) {
            let msg = msgs[i]
            sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
        }
    } else {
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
    }
}

好了下班前, 把这个折腾好几晚上的问题.搞定. 希望可以帮助更多的人. 折腾不易. 希望得到帮助的小哥哥们,打赏一下. 谢谢啦...

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分