不使用hamibot的配置功能,如何为自己的代码写一个UI设置配置界面?有没有例子。
如何获取用户信息,例如用户唯一ID,使用的手机型号等
我要写一个可以配置变量的界面,不使用hamibot的配置页,例如配置a的变量为数字,这个数字可以在一个可视化界面填写,这个变量可以存储起来,在代码中运行可以打印这个变量。代码怎么写?
回答
要在Hamibot中不使用配置功能而自己编写UI设置配置界面,你可以使用UI模块直接构建自定义界面。以下是具体方法和示例:
在脚本最前面必须添加 'ui'; 指令来启用UI模式,然后使用ui.layout()构建界面。Hamibot的UI系统基于Android,你可以使用各种控件来创建设置界面。
下面是一个完整的自定义设置界面示例:
'ui'; // 必须在脚本最前面
// 文档地址 https://docs.hamibot.com/
// 初始化存储设置的对象
var settings = {
username: "",
theme: "light",
notifications: true
};
// 从存储中加载已保存的设置
if (storages.contains('my_settings')) {
settings = storages.get('my_settings');
}
ui.layout(
<vertical padding="16">
<text text="账户设置" textSize="18sp" textColor="#333" margin="0 16 0 8"/>
<input id="username" hint="请输入用户名" text="{{settings.username}}" margin="0 0 0 16"/>
<text text="主题选择" textSize="18sp" textColor="#333" margin="0 16 0 8"/>
<radiogroup id="themeGroup" orientation="horizontal" margin="0 0 0 16">
<radio text="浅色" checked="{{settings.theme === 'light'}}" value="light"/>
<radio text="深色" checked="{{settings.theme === 'dark'}}" value="dark" margin="16 0 0 0"/>
</radiogroup>
<checkbox id="notifications" text="启用通知" checked="{{settings.notifications}}" margin="16 16 0 16"/>
<button id="saveBtn" text="保存设置" margin="16 24 16 0" bg="#4CAF50" textColor="#FFF" textSize="16sp"/>
</vertical>
);
// 保存按钮点击事件
ui.saveBtn.on("click", function() {
// 获取当前界面值
settings.username = ui.username.text();
settings.theme = ui.themeGroup.checkedRadioButton().getValue();
settings.notifications = ui.notifications.checked();
// 保存到存储
storages.put('my_settings', settings);
toast("设置已保存");
// 可以在这里添加应用设置的逻辑
applySettings();
});
// 应用设置的函数
function applySettings() {
// 这里可以添加应用设置的逻辑
// 例如根据主题设置更改界面颜色等
console.log("应用设置:", settings);
}
关键点说明:
- 必须在脚本开头添加
'ui';指令 - 使用
storages对象来保存和读取用户设置 - UI布局使用XML语法描述,支持各种Android控件
- 通过
ui.控件id访问界面元素 - 使用
on("click", function() {...})添加事件处理
注意事项:
- UI脚本不能包含任何在
'ui';之前的代码 - 避免使用JavaScript保留字作为变量名
- 所有UI控件属性和方法都基于Android,可以参考Android官方文档
- 如果需要更复杂的UI,可以组合使用各种布局和控件
这个例子展示了如何创建一个包含文本输入、单选按钮和复选框的设置界面,并实现设置的保存和应用功能。你可以根据实际需求扩展这个界面,添加更多设置选项。
补充回答 1
在Hamibot中,获取设备信息(即你所指的"用户信息")主要通过两种方式:API接口和脚本内设备对象。
通过API获取设备信息
你可以使用以下API获取设备列表或特定设备信息:
// 文档地址 https://docs.hamibot.com/
var res = http.request('https://api.hamibot.com/v1/devices', {
method: 'GET',
headers: {
authorization: '你的令牌(hmp开头)',
},
});
log(res.body.json());
响应示例:
{
"count": 1,
"items": [
{
"_id": "a51d237e9af41ecc021c9ff6",
"online": true,
"tags": ["tag1", "tag2"],
"name": "零号机",
"brand": "Xiaomi",
"model": "MI 11"
}
]
}
_id:设备唯一标识符(相当于设备ID)brand:设备品牌(如Xiaomi)model:设备型号(如MI 11)
要获取特定设备信息,使用:
var res = http.request('https://api.hamibot.com/v1/devices/设备_id', {
method: 'GET',
headers: {
authorization: '你的令牌(hmp开头)',
},
});
在脚本中直接获取设备信息
在运行中的脚本里,可以直接使用device对象获取设备信息:
// 文档地址 https://docs.hamibot.com/
log("设备品牌: " + device.brand);
log("设备型号: " + device.model);
log("Android ID: " + device.getAndroidId());
log("IMEI: " + device.getIMEI());
log("MAC地址: " + device.getMacAddress());
这些方法能获取到:
device.brand:设备品牌device.model:设备型号device.getAndroidId():Android ID(设备唯一标识)device.getIMEI():IMEI号device.getMacAddress():MAC地址
注意:getIMEI()、getMacAddress()等方法需要相应权限,部分功能在非root设备上可能受限。设备的唯一标识主要使用API返回的_id或脚本中的device.getAndroidId()。
补充回答 2
要创建一个自定义的变量配置界面,你可以使用Hamibot的UI模块来实现。以下是一个完整的示例代码,它创建了一个输入数字的界面,并将输入的值存储到本地文件中:
"ui";
// 文档地址 https://docs.hamibot.com/
// 导入必要的模块
const files = require('files');
const storages = require('storages');
// 创建存储对象,用于持久化保存变量
const storage = storages.create('my-config');
// 检查是否已有保存的变量值
let savedValue = storage.get('a', '');
// 创建UI布局
ui.layout(
<vertical padding="16">
<text text="配置数字变量 a" textSize="18" margin="0 0 0 16"/>
<input id="inputA" hint="请输入数字" inputType="number" text={savedValue} margin="0 0 0 16"/>
<horizontal gravity="right">
<button id="saveBtn" text="保存" style="Widget.AppCompat.Button.Colored" w="90"/>
<button id="showBtn" text="显示值" style="Widget.AppCompat.Button.Colored" w="90" margin="8 0 0 0"/>
</horizontal>
</vertical>
);
// 保存按钮点击事件
ui.saveBtn.on('click', () => {
const inputText = ui.inputA.text();
if (inputText === '') {
toast('请输入数字');
return;
}
// 验证是否为数字
const num = parseFloat(inputText);
if (isNaN(num)) {
toast('请输入有效的数字');
return;
}
// 保存到存储
storage.put('a', num.toString());
toast('已保存数字: ' + num);
});
// 显示值按钮点击事件
ui.showBtn.on('click', () => {
const value = storage.get('a', '未设置');
toastLog('当前变量 a 的值为: ' + value);
// 在控制台也打印
console.log('变量 a 的值:', value);
});
这段代码实现了以下功能:
- 创建了一个包含输入框和两个按钮的界面
- 输入框设置为只接受数字输入(
inputType="number") - 使用
storages模块持久化存储变量,即使脚本关闭后值也不会丢失 - "保存"按钮会验证输入是否为有效数字并保存
- "显示值"按钮会显示当前存储的值
如果你想在其他脚本中使用这个存储的变量,可以这样获取:
// 文档地址 https://docs.hamibot.com/
const storages = require('storages');
const storage = storages.create('my-config');
const a = storage.get('a', '0');
toastLog('变量 a 的值为: ' + a);
console.log('变量 a 的值:', a);
注意:
- 脚本开头必须有
"ui";声明 - 使用
storages.create('my-config')创建独立的存储空间,避免与其他脚本冲突 - 存储的值都是字符串类型,使用时需要转换为数字(
parseFloat()) - 这个界面会一直运行直到你手动停止脚本或返回主界面
如果需要更复杂的验证逻辑,你可以在保存按钮的点击事件中添加更多检查。