// 主动检测悬浮窗权限,没开就跳设置页
if (!floaty.checkPermission()) {
toast("正在跳转到悬浮窗权限设置页");
floaty.requestPermission();
sleep(2000);
// 强制声明系统级悬浮窗类型,适配Android10+
floaty.setWindowType("system_alert_window");
}
// 创建超大号悬浮窗,绝对不会看漏
let win = floaty.rawWindow(
<frame w="150dp" h="150dp" bg="#FF0000" gravity="center">
<text text="悬浮窗" textSize="20sp" color="#FFFFFF" gravity="center"/>
</frame>
);
// 固定在屏幕正中央,强制置顶
win.setGravity(Gravity.CENTER);
win.show();
toast("悬浮窗已显示在屏幕中央");
// 用前台定时器保活,防止系统杀进程
setInterval(() => {
win.bringToFront(); // 每秒强制置顶一次
}, 500);
回答
// 文档地址 https://docs.hamibot.com/
你的脚本整体思路正确,但在 Hamibot 环境中存在一些兼容性和 API 使用上的问题,以下是你代码中的关键点分析和修改建议:
问题说明
floaty.setWindowType("system_alert_window"):Hamibot 不支持该方法。悬浮窗的窗口类型由系统自动管理,调用此方法会报错。win.setGravity(Gravity.CENTER):Gravity未定义。你需要导入 Android 的Gravity类。w="150dp"写法错误:XML 中应使用width而不是w,同理h应为height。sleep(2000)在非线程环境下可能导致阻塞,但在此上下文中可接受。setInterval(() => {}, 500)使用了箭头函数,而 Hamibot 使用的是 Rhino 1.7.15 引擎,不支持 ES6 箭头函数。
✅ 修改后的可用版本(适配 Hamibot)
// 文档地址 https://docs.hamibot.com/
// 主动检测悬浮窗权限,没开就跳设置页
if (!floaty.checkPermission()) {
toast("正在跳转到悬浮窗权限设置页");
floaty.requestPermission();
sleep(2000);
// 注意:Hamibot 不支持 floaty.setWindowType,无需也不可设置
}
// 创建超大号悬浮窗,绝对不会看漏
let win = floaty.rawWindow(
<frame width="150dp" height="150dp" bg="#FF0000" gravity="center">
<text text="悬浮窗" textSize="20sp" color="#FFFFFF" gravity="center"/>
</frame>
);
// 导入 Android Gravity 类用于 setGravity
const Gravity = android.view.Gravity;
// 固定在屏幕正中央,强制置顶
ui.run(function() {
win.setGravity(Gravity.CENTER);
});
win.show();
toast("悬浮窗已显示在屏幕中央");
// 用定时器保活,防止被系统回收(使用普通函数,避免箭头函数)
setInterval(function() {
ui.run(function() {
win.bringToFront(); // 提升层级,确保置顶
});
}, 500);
// 防止脚本退出关闭悬浮窗
setInterval(function() {}, 1000);
补充说明
floaty.rawWindow创建原始悬浮窗,不会自带控制按钮,适合做全屏或固定样式悬浮窗。ui.run()是必须的,因为setGravity()等操作需要在 UI 线程执行。- 最后的空
setInterval是保持脚本运行的关键,否则脚本结束会自动关闭悬浮窗。 - 权限请求后不能立即创建:部分设备需手动返回应用,建议提示用户返回后再运行脚本。
建议优化
你可以增加权限等待循环,提升用户体验:
// 等待用户授权后再创建悬浮窗
while (!floaty.checkPermission()) {
toast("请先授予悬浮窗权限");
floaty.requestPermission();
sleep(2000);
}
// 授权通过后继续执行创建逻辑
这样可以确保权限到位后再显示悬浮窗。
ℹ️ 本回答由 AI 生成,内容仅供参考