跳转到内容

发送短信

更新: 2025/7/20 字数: 0 字 时长: 0 分钟

在 Android 开发中,使用 Bot.js 可以轻松编写自动化脚本。本篇文章将介绍如何使用 Bot.js 发送短信。


准备工作

在开始之前,请确保以下条件已满足:

  • 已授予发送短信的权限(如 SEND_SMS);
  • 设备已插入可用 SIM 卡。

!!!注意
首次发送短信时,部分品牌(如华为、小米等)可能会弹出系统提示框,例如:

"**APP" 正尝试发送短信,可能产生费用,请进行身份验证"

这是系统用于提醒用户发送行为的提示,用户需手动选择“允许”或“始终允许”才能继续发送。

短信权限弹窗示意图


编写代码

创建一个新的脚本文件,在其中导入 android.app.PendingIntent 并构建基本的短信发送逻辑:

js
importClass('android.app.PendingIntent');

var smsManager = android.telephony.SmsManager.getDefault();
var phoneNumber = "1234567890"; // 设置要发送短信的手机号
var message = "Hello,  Bot.js!";  // 设置短信内容

// 创建 PendingIntent 监听发送和投递状态
var sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
var deliveredIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);

// 发送短信
smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, deliveredIntent);

🔁 封装函数 为了便于复用,我们建议将短信功能封装为函数:

js

/**
 * 发送短信
 * @param {string} phoneNumber - 接收方号码
 * @param {string} message - 短信内容
 */
function sendSMS(phoneNumber, message) {
    let smsManager = android.telephony.SmsManager.getDefault();
    let sentIntent = android.app.PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    let deliveredIntent = android.app.PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, deliveredIntent);
}

sendSMS("1234567890", "Hello, Bot.js!");

✅ 权限检查(建议添加) 为防止运行时因权限不足导致发送失败,建议加入权限判断逻辑:

js
"ui"; // 启用 Bot.js 的 UI 模式,确保可以使用 Activity 和权限相关 API

// 导入必要的 Android 原生类
importClass(android.Manifest); // 用于访问权限常量,如 SEND_SMS
importClass(android.content.pm.PackageManager); // 用于判断权限状态
importClass(android.app.Activity); // 当前运行的 Activity 实例

// 定义短信发送权限常量
const SEND_SMS = Manifest.permission.SEND_SMS;

// 检查是否已授权发送短信权限
if (activity.checkSelfPermission(SEND_SMS) !== PackageManager.PERMISSION_GRANTED) {
    console.log("未授权,请求权限");

    // 👉 注意:如果用户之前选择“拒绝且不再询问”,此处不会再弹窗,需手动前往设置开启权限
    activity.requestPermissions([SEND_SMS], 100);

    // 注册权限请求结果的监听器
    activity.getEventEmitter().on("request_permissions_result", (requestCode, resultCode, resultIntent) => {
        if (requestCode === 100) { // 确认是我们请求的权限
            // 检查授权结果(resultIntent 为权限授予结果数组)
            if (resultIntent.length > 0 && resultIntent[0] === PackageManager.PERMISSION_GRANTED) {
                toast("权限已授予");
                // 在这里执行发送短信的逻辑
                sendSMS("1234567890", "Hello, Bot.js!");
            } else {
                toast("请手动授予短信权限"); // 用户拒绝授权
            }
        }
    });
} else {
    console.log("已授权,直接发送短信");

    // 已经有权限,可以直接发送短信
    sendSMS("1234567890", "Hello, Bot.js!");
}
/**
 * 发送短信
 * @param {string} phoneNumber - 接收方号码
 * @param {string} message - 短信内容
 */
function sendSMS(phoneNumber, message) {
    let smsManager = android.telephony.SmsManager.getDefault();
    let sentIntent = android.app.PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    let deliveredIntent = android.app.PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, deliveredIntent);
}

运行脚本

将完整代码保存为 send-sms.js,在 Bot.js 应用中打开并运行。运行过程中如弹出系统提示,请点击“允许”或“始终允许”完成授权。

补充说明

短信内容请勿过长,建议控制在 70 字以内(超出可能会拆分成多条发送);

某些设备需要手动确认首次短信发送请求,避免拦截;

请确保接收方号码格式正确,SIM 状态正常。 若遇到如下错误提示:

yaml
Wrapped java.lang.SecurityException: Sending SMS message: uid 10594 does not have android.permission.SEND_SMS.

说明当前应用尚未获得发送短信的授权,请在系统设置中开启相应权限后重试。

指定卡槽发送

js
importClass(android.app.PendingIntent);
importClass(android.content.Intent);

// 手机号码和短信内容
let phoneNumber = "1234567890";
let message = "Hello, Bot.js!";

// 获取 SubscriptionManager 实例(需要 API 22+)
let subscriptionManager = context.getSystemService(android.content.Context.TELEPHONY_SUBSCRIPTION_SERVICE);

// 获取所有激活的 SIM 卡信息列表
let subscriptionList = subscriptionManager.getActiveSubscriptionInfoList();

if (subscriptionList == null || subscriptionList.size() === 0) {
    toast("未检测到激活的SIM卡");
} else {
    // 选择用卡2发送,索引为1,确保设备有2张卡
    if (subscriptionList.size() < 2) {
        toast("设备只检测到1张SIM卡,默认使用卡1发送短信");
        simInfo = subscriptionList.get(0);
    } else {
        simInfo = subscriptionList.get(1); // 卡2
    }

    // 获取指定 SIM 卡的 SmsManager 实例
    let smsManager = android.telephony.SmsManager.getSmsManagerForSubscriptionId(simInfo.getSubscriptionId());

    // 创建PendingIntent,用于监听发送和送达状态
    let sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    let deliveredIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);

    // 发送短信
    smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, deliveredIntent);

    toast("短信已发送,使用卡槽:" + (simInfo.getSimSlotIndex() + 1));
}

总结

借助 Bot.js 提供的短信接口和权限管理能力,您可以高效构建自定义的通信类脚本。通过封装函数与加入权限处理,脚本更稳健,也能更好兼容不同品牌设备。

如有更多问题,欢迎在社区交流或查阅其他文档。