发送短信
更新: 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 提供的短信接口和权限管理能力,您可以高效构建自定义的通信类脚本。通过封装函数与加入权限处理,脚本更稳健,也能更好兼容不同品牌设备。
如有更多问题,欢迎在社区交流或查阅其他文档。