下面我将为你详细分解 MIUI 短信相关的 Tasker 配置,包括接收短信和发送短信两个场景,并提供完整的参数列表和实例。

核心概念:MIUI 的特殊性
MIUI 的短信应用(com.android.mms)在发送和接收短信时,不会完全遵循标准的 Android AOSP (Android Open Source Project) 规范,我们不能直接使用像 %SMSRB (短信接收框) 这样的标准变量。
MIUI 主要通过 Broadcast Receiver (广播接收器) 来传递短信信息,并且会将短信内容打包在一个特定的 Intent (意图) 中。
接收短信并处理
这是最常见的用法,比如自动回复、识别关键词并执行操作等。
配置步骤
-
创建新 Profile:
(图片来源网络,侵删)- 选择 Event (事件) -> Event (事件) -> State (状态) -> Hardware (硬件) -> Phone (电话)。
- 在 Phone State 选项中,选择 Incoming SMS (接收短信)。
-
进入 Task 编辑界面:
点击进入刚刚创建的关联 Task。
-
添加 Action (动作):
- 我们需要添加一个 Code (代码) 动作来解析 MIUI 发送的 Intent 数据。
- 点击 号,选择 Task (任务) -> Code (代码)。
- 在 Enter Code 窗口中,粘贴下面的代码。
解析短信的代码
这是最关键的一步,这段代码会从 MIUI 的 Intent 中提取出发送者、内容和时间戳。

// 获取从 MIUI 短信应用发来的 Intent 对象
var intent = getIntent();
// 从 Intent 中获取短信内容
// MIUI 通常会将短信内容放在 "sms_body" 这个 key 里
var smsBody = intent.getStringExtra("sms_body");
// 从 Intent 中获取发送者号码
// MIUI 通常会将号码放在 "address" 这个 key 里
var senderNumber = intent.getStringExtra("address");
// 从 Intent 中获取时间戳 (毫秒)
var timestamp = intent.getLongExtra("timestamp", 0);
// 将解析出的信息保存到 Tasker 变量中,方便后续使用
// 使用 "let" 关键字创建全局变量
let SenderNumber = senderNumber;
let SMSBody = smsBody;
let SMSTimestamp = timestamp;
// (可选) 为了调试,你可以在通知栏显示这些变量,看看是否获取成功
// %SMSBODY, %SENDERNUMBER 等变量可以直接在其他 Action 中使用
代码解释:
getIntent(): 获取触发这个 Task 的原始 Intent 对象。getStringExtra("sms_body"): 从 Intent 中以字符串形式获取短信正文。"sms_body"是 MIUI 使用的 key。getStringExtra("address"): 从 Intent 中以字符串形式获取发送者的电话号码。"address"是标准的 key。getLongExtra("timestamp", 0): 获取短信的时间戳。let ... = ...: 这是 Tasker 中创建和赋值全局变量的标准语法,创建后,你就可以在其他任何 Task 的字段中使用%SenderNumber,%SMSBody,%SMSTimestamp这些变量了。
完整参数列表 (接收短信)
当你使用 getStringExtra() 或 getLongExtra() 时,可以尝试从 Intent 中获取的参数有:
| 参数 Key (字符串) | 类型 | 描述 | 备注 |
|---|---|---|---|
sms_body |
String | 短信正文内容 | 最常用,MIUI 特有的 key。 |
address |
String | 发送者/接收者号码 | 标准的 key,用于电话号码。 |
timestamp |
long | 短信时间戳 (毫秒) | 标准的 key,用于记录时间。 |
protocol |
int | 短信协议类型 (如 0 for SMS) | 较少使用。 |
status |
int | 短信发送状态 (如 -1 for pending) | 主要用于发送短信的回调。 |
sim_id |
int | SIM 卡 ID | 在双卡手机上非常有用,0 或 1。 |
发送短信
使用 Tasker 发送短信,在 MIUI 上同样需要注意,因为标准的 Send SMS 动作有时会被 MIUI 的安全机制或短信拦截功能干扰。
推荐方法:使用 HTTP Request (最稳定)
这是最可靠的方法,它不依赖于 MIUI 的内部接口,而是调用系统的短信发送 API。
-
创建新 Task:
- 点击 号,选择 Task (任务) -> Code (代码)。
- 在 Enter Code 窗口中,粘贴下面的代码。
-
发送短信的代码
// 定义要发送的号码和内容
var phoneNumber = "10086"; // 替换成你要发送的号码
var messageText = "这是 Tasker 通过 HTTP API 发送的测试短信。";
// 使用系统自带的 SmsManager API 发送短信
// 这是 Android 标准方式,MIUI 一般无法拦截
var smsManager = SmsManager.getDefault();
// 将长短信分割成多条(如果需要)
// try-catch 是为了处理旧版本 Android API 的兼容性问题
try {
var parts = smsManager.divideMessage(messageText);
smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
} catch (e) {
// divideMessage 不可用,直接发送单条短信
smsManager.sendTextMessage(phoneNumber, null, messageText, null, null);
}
// (可选) 显示通知,表示发送成功
flash("短信已发送至: " + phoneNumber, 2000);
代码解释:
SmsManager.getDefault(): 获取系统短信管理器。smsManager.divideMessage(messageText): 将长文本分割成符合短信长度限制的多条消息,这是推荐的做法,可以避免发送失败。smsManager.sendMultipartTextMessage(...): 发送分割后的多条短信。smsManager.sendTextMessage(...): 发送单条短信(备用方案)。flash(...): 在屏幕上短暂显示一条提示信息。
传统方法:使用 Send SMS 动作 (可能不稳定)
- 在 Task 中添加 Task (任务) -> Net (网络) -> HTTP Request (HTTP 请求)。
- Method: 选择
POST。 - URL: 留空或填入一个无效的 URL,因为我们不真正访问网络。
- Headers: 点击 Add,添加以下 Header:
- Key:
Content-Type - Value:
application/x-www-form-urlencoded
- Key:
- Body: 填写以下内容:
phone=%PhoneNumber&msg=%MessageText这里的
%PhoneNumber和%MessageText是你预先在 Task 中用 Set Variable 动作定义好的变量。 - After Request: 选择 Do Nothing。
为什么这个方法可能不稳定?
MIUI 的“骚扰拦截”功能可能会检测到这种非标准的发送方式,并将其拦截。强烈推荐使用上面的 SmsManager 代码方法。
完整参数列表 (发送短信)
当你构建发送短信的请求或代码时,会用到这些参数:
| 参数名称 | 描述 | 示例 |
|---|---|---|
| PhoneNumber | 目标手机号码 | 13800138000 |
| MessageText | 要发送的短信内容 | 你好,这是来自 Tasker 的消息。 |
| SimId | (可选) 指定使用哪个 SIM 卡发送 | 0 (卡1), 1 (卡2) |
总结与最佳实践
| 功能 | 推荐方法 | 关键代码/参数 | 备注 |
|---|---|---|---|
| 接收短信 | Profile: Incoming SMS + Code Action | let SMSBody = getIntent().getStringExtra("sms_body");let SenderNumber = getIntent().getStringExtra("address"); |
必须用代码解析,这是 MIUI 的核心特点。 |
| 发送短信 | Code Action + SmsManager |
SmsManager.getDefault().sendTextMessage(...) |
最稳定、最可靠,不受 MIUI 拦截影响。 |
| 发送短信 | (不推荐) HTTP Request | phone=%PhoneNumber&msg=%MessageText |
可能被 MIUI 骚扰拦截功能阻止。 |
实用案例:自动回复“开会中”
-
Profile:
- Event: Phone -> Incoming SMS
- Advanced (高级设置): Regex (正则表达式) 匹配
From(来源) -> (匹配所有号码)
-
Task (名为 "AutoReply"):
- Action 1: Code
// 解析短信 let SMSBody = getIntent().getStringExtra("sms_body"); let SenderNumber = getIntent().getStringExtra("address"); - Action 2: Code (发送回复)
// 使用 SmsManager 发送自动回复 var replyText = "您好,我正在开会,稍后回复您。"; var smsManager = SmsManager.getDefault(); try { var parts = smsManager.divideMessage(replyText); smsManager.sendMultipartTextMessage(SenderNumber, null, parts, null, null); } catch (e) { smsManager.sendTextMessage(SenderNumber, null, replyText, null, null); } - Action 3: Flash (显示通知)
- Text:
已自动回复给 %SenderNumber - Duration:
3000(毫秒)
- Text:
- Action 1: Code
只要你的手机收到任何短信,这个 Task 就会自动运行,解析出发送者号码,并向该号码发送预设好的“开会中”回复。
希望这份详细的指南能帮助你在 MIUI 系统上完美使用 Tasker 处理短信!
