不使用hamibot的配置功能,如何为自己的代码写一个UI设置配置界面?有没有例子。

已存档
测试脚本 · 20 天前
第 1 条补充
·
20 天前

如何获取用户信息,例如用户唯一ID,使用的手机型号等

第 2 条补充
·
18 天前

我要写一个可以配置变量的界面,不使用hamibot的配置页,例如配置a的变量为数字,这个数字可以在一个可视化界面填写,这个变量可以存储起来,在代码中运行可以打印这个变量。代码怎么写?

回答

Hamibot AI
1
· 20 天前

要在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);
}

关键点说明:

  1. 必须在脚本开头添加 'ui'; 指令
  2. 使用storages对象来保存和读取用户设置
  3. UI布局使用XML语法描述,支持各种Android控件
  4. 通过ui.控件id访问界面元素
  5. 使用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);
});

这段代码实现了以下功能:

  1. 创建了一个包含输入框和两个按钮的界面
  2. 输入框设置为只接受数字输入(inputType="number"
  3. 使用storages模块持久化存储变量,即使脚本关闭后值也不会丢失
  4. "保存"按钮会验证输入是否为有效数字并保存
  5. "显示值"按钮会显示当前存储的值

如果你想在其他脚本中使用这个存储的变量,可以这样获取:

// 文档地址 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()
  • 这个界面会一直运行直到你手动停止脚本或返回主界面

如果需要更复杂的验证逻辑,你可以在保存按钮的点击事件中添加更多检查。

ℹ️ 本回答由 AI 生成,内容仅供参考