Tasker Java Code 动作详解 BeanShell 语法 Android API 调用 AI 辅助生成
Java Code vs JavaScriptlet
Java Code 是 Tasker 6.6 新增的脚本入口,与老牌 JavaScriptlet 的定位完全不同:
| 维度 | JavaScriptlet | Java Code |
|---|---|---|
| 执行引擎 | Tasker 内置 JS 引擎 | BeanShell(类 Java 语法) |
| 语言 | JavaScript(ECMAScript 5) | 类 Java 语法(宽松的 Java 5 风格) |
| Android API | ❌ 只能通过 tasker.* | ✅ 完整 Android API 访问 |
| AI 助手 | ❌ | ✅ 内置 AI 代码生成/修改 |
| RxJava | ❌ | ✅ 支持 |
| 返回 Tasker 变量 | ✅ tasker.returnValue() | ✅ 可以返回 Tasker 或 Java 变量 |
| 典型用途 | 数据处理、变量操作 | 系统 API 调用、Accessibility、UI 自动化 |
一句话选择:需要调用 Android 原生 API 时用 Java Code,其他场景(数据处理、变量操作)还是 JavaScriptlet 更顺手。
BeanShell 语法入门
Java Code 的执行环境是 BeanShell。它的语法比标准 Java 宽松很多——不需要写完整类结构、不需要分号、不需要声明变量类型。
和 Java 的主要差异
// 标准 Java
String name = "小明";
int count = 42;
System.out.println("Hello");
// BeanShell(Tasker Java Code 里)
name = "小明"; // 不需要类型声明
count = 42;
print("Hello"); // print() 是内置快捷方法
常用语法示例
// 变量(不需要声明类型)
battery = context.getSystemService(context.POWER_SERVICE);
level = battery.getIntProperty(battery.BATTERY_PROPERTY_CAPACITY);
// 字符串拼接
msg = "当前电量:" + level + " %";
// 条件
if (level < 20) {
tasker.notify("低电量", msg);
} else {
print("电量正常");
}
// 循环
for (i = 0; i < 10; i++) {
print("第 " + i + " 次");
}
// 数组 / 集合
list = new ArrayList();
list.add("苹果");
list.add("橘子");
for (item : list) {
print(item);
}
访问 Android API
这是 Java Code 最大的价值。你可以访问 Android Context 拿到任何系统服务。
获取 Context
// Tasker 自动注入 context 变量
print(context.getPackageName()); // 打印 "net.dinglisch.android.taskerm"
LocationManager 获取定位
locManager = context.getSystemService(context.LOCATION_SERVICE);
// 获取上次已知位置
lastLoc = locManager.getLastKnownLocation(locManager.GPS_PROVIDER);
if (lastLoc != null) {
lat = lastLoc.getLatitude();
lng = lastLoc.getLongitude();
tasker.setGlobal("%Lat", lat.toString());
tasker.setGlobal("%Lng", lng.toString());
}
发起 Intent 跳转
// 打开地图到指定坐标
intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
uri = android.net.Uri.parse("geo:39.9,116.4?q=39.9,116.4(北京)");
intent.setData(uri);
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
AlarmManager 设置闹钟
alarmManager = context.getSystemService(context.ALARM_SERVICE);
// 1 分钟后触发
calendar = java.util.Calendar.getInstance();
calendar.add(java.util.Calendar.MINUTE, 1);
intent = new android.content.Intent(context, YourReceiver.class);
pendingIntent = android.app.PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.set(alarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Accessibility Service(UI 自动化)
Tasker 6.6 可以通过 Java Code 获取 Accessibility Service 的引用:
// 获取 Accessibility Service
service = tasker.getAccessibilityService();
// 查找可点击节点
root = service.getRootInActiveWindow();
if (root != null) {
nodes = root.findAccessibilityNodeInfosByText("确定");
if (!nodes.isEmpty()) {
node = nodes.get(0);
node.performAction(android.accessibilityservice.AccessibilityNodeInfo.ACTION_CLICK);
}
}
→ 可以实现"自动点击弹窗里的确定按钮"这类 UI 自动化场景。
AI 代码助手
Java Code 编辑器右上角有个放大镜图标,点击后打开 AI 助手面板:
内置 AI
- 直接描述你想实现的功能,AI 生成 BeanShell 代码
- AI 基于 BeanShell + Tasker API 知识库
- 可以修改现有代码——选中后让 AI 优化/注释/重写
外部 AI
- 可以把系统指令复制出来,粘贴到 ChatGPT / Gemini / Claude 等外部 AI
- 外部 AI 生成的代码可以直接粘回 Tasker 编辑器
- 好处是可以用更强大的外部模型,或需要联网查询时
AI 提示词示例
用户:帮我写一段 BeanShell 代码,获取当前连接的 Wi-Fi SSID,
如果包含 "home" 就设置变量 %IsHome 为 1
AI 生成:
wifiManager = context.getSystemService(context.WIFI_SERVICE);
info = wifiManager.getConnectionInfo();
ssid = info.getSSID(); // 可能带引号:"MyHomeWiFi"
if (ssid != null && ssid.contains("home")) {
tasker.setGlobal("%IsHome", "1");
} else {
tasker.setGlobal("%IsHome", "0");
}
从 Tasker 返回值
Java Code 执行完后可以给 Tasker 主流程返回值:
// 返回一个 Tasker 变量值
tasker.returnValue(someResult);
// 或者设置多个 Tasker 变量
tasker.setGlobal("%Lat", lat.toString());
tasker.setGlobal("%Lng", lng.toString());
tasker.returnValue("ok");
RxJava2 异步支持
Tasker 6.6 的 Java Code 内置 RxJava2 支持,可以写异步操作:
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
Observable.fromCallable(() -> {
// 在后台线程执行耗时操作
Thread.sleep(1000);
return "后台任务完成";
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(result -> {
tasker.notify("结果", result);
});
但注意——Tasker 的 Java Code 是阻塞执行的,这段代码里的 Rx 订阅虽然是非阻塞的,但 Tasker 会等整个脚本跑完才继续。如果只是简单的后台执行,用 Perform Task 或 Stop 后异步执行可能更合适。
安全注意
- Java Code 可以直接访问 Android 系统 API,不代表什么都能做——受 Android 权限模型限制
- 访问需要权限的 API(如位置、联系人、相机)前,确保 Tasker 已获得对应运行时权限
- 不要执行来源不明的 BeanShell 代码——它能访问整个系统
- 复杂代码先在测试环境里验证,再部署到正式 Profile