Releases: godweiyang/ToolBox
Releases · godweiyang/ToolBox
Release list
v1.8.8 修复多工具发版阻塞问题
ToolBox v1.8.8
修复
- 修复 Android 14 上局域网文件互传前台服务启动时缺少服务类型导致崩溃的问题。
- 修复 Android 10+ 文件互传列表可见但下载 404 的问题,改为通过 MediaStore content Uri 读取文件。
- 修复 Android 13+ 视频下载被不必要的媒体读取权限拦截的问题。
- 修复金属探测器弱震动报警参数长度不匹配导致的崩溃。
- 修复视频下载页面退出后后台进度回调仍更新 UI 的生命周期风险。
- 修复视频转 GIF 输出 Uri 查询不可靠、失败时残留 pending 媒体项的问题。
- 修复 Android 8/9 上二维码、九宫格、GIF、视频转 GIF、文件互传保存前缺少写存储权限的问题。
- 修复 WiFi 热力图申请步频权限后重复启动采样导致传感器重复注册的问题。
清理
- 清理构建 warning 和局部代码卫生问题,保持 debug/release 构建日志干净。
v1.8.7 自适应步长+朝向低通滤波
v1.8.7 自适应步长 + 朝向低通滤波
改进1:自适应步长(Weinberg 算法)
- 不再固定 0.65 米/步
- 每步根据加速度幅值的峰值/谷值动态估算:
stepLength = K * sqrt(accelMax - accelMin) - 步子大(跑步)→ 步长自动增大;步子小(慢走)→ 步长自动减小
- 限制步长在 0.3 ~ 1.2 米合理范围
- 即使有系统 TYPE_STEP_DETECTOR,也同时注册加速度计用于步长估算
改进2:朝向低通滤波
- 用复数平均法平滑朝向读数(滑动窗口 10 个采样)
- 避免角度绕圈问题(359°↔1° 跳变)
- 减少瞬时抖动,缓解"走 10 步南 + 10 步北不回到原点"的漂移
诚实的局限说明
PDR(行人航迹推算)是手机室内定位的固有问题,本方案仍做不到精确还原户型:
- 朝向漂移:室内金属家具、电器会干扰磁力计,慢速移动时陀螺仪也会漂移
- 步数漏检/多检:系统步频检测偶尔会漏步或多步
- 步长估算误差:Weinberg 算法是经验公式,不同人/不同步伐会有偏差
- 无闭环修正:手机端没有"知道回到起点"的能力,误差会持续累积
如果想要精确的户型图,需要其他方案(WiFi 指纹 SLAM、蓝牙信标等),手机端纯 PDR 只能给出相对轨迹的近似。
v1.8.6 用步频检测PDR替代加速度积分
v1.8.6 用步频检测 PDR 替代加速度积分
根本问题
之前的加速度二次积分方案在室内定位不可行:
- 传感器噪声被积分放大,导致静止时漂移
- 重力分离不完美
- 手机竖着拿时水平加速度主要在 z 轴,被忽略
- 即使走动 1.5 秒,积分位移也只有几厘米,根本看不出移动
修复:改用步频检测 PDR
- TYPE_STEP_DETECTOR 系统级步频检测(Android 4.4+,准确可靠)
- 每检测到一步,沿当前朝向推进固定步长 0.65 米
- TYPE_ROTATION_VECTOR 提供朝向
- 静止时(无步数)采样点位置不变,只更新信号值
- Android 10+ 需要 ACTIVITY_RECOGNITION 运行时权限,首次使用会弹窗请求
- 无 STEP_DETECTOR 传感器或未授权时,回退到加速度计手动步频检测(状态机:幅值超阈值 → 等峰值 → 回落判定为一步)
注意
- 首次启动会请求"身体活动识别"权限,授权后下次启动才能用系统步频检测
- 本次启动如未授权,会用加速度计回退方案(准确度稍低但仍可用)
- 采样点下方会显示"共 X 步",可确认步频检测是否生效
v1.8.5 修复热力图位移不灵敏+同点颜色叠加
v1.8.5 修复热力图位移不灵敏 + 同点颜色叠加
问题1:移动了但点不跟着移动
根因: 上一版用 s += a * dt² * 0.5 直接积分位移,这个值极小(加速度 2 m/s²,dt=0.02s,s=0.0004m),走 1.5 秒也才几厘米,根本看不出移动。
修复: 改为速度积分法
- 速度积分:
v += a * dt - 位移积分:
s += v * dt + 0.5 * a * dt² - 走动时持续累积速度,位移才合理
问题2:ZUPT 零速更新防止漂移
- 检测到静止时(加速度幅值 < 1.5 m/s²)连续 3 次后强制清零速度
- 避免传感器噪声导致静止时速度累积漂移
- 走动阈值从 1.0 提高到 1.5 m/s,避免轻微晃动误判为走动
问题3:同一点颜色越叠越深
根因: 站着不动时每 1.5 秒采一个点,多个色块叠加 alpha 越来越高。
修复: 移动距离 < 0.3m 时,更新最后一个采样点的 RSSI 而不是追加新点
HeatMapView.updateLastSample(rssi)替换最后一个点的信号值- 同位置的色块只反映最新信号,不会越叠越深
v1.8.4 热力图位移检测优化+禁用Tab滑动
v1.8.4 改进
1. 采样点位置基于真实位移(修复静止时点飘移)
- 新增加速度计 + 旋转矢量传感器
- 低通滤波分离重力,检测水平方向线性加速度
- 只在检测到走动(加速度幅值 > 1.0 m/s²)时积分位移
- 手机静止时采样点位置保持不变,只更新信号值
- 走动时按朝向把位移从手机坐标系旋转到世界坐标系
- 单周期累计位移上限 1.5 米,避免抖动导致大跳
2. 去掉点上的文字标签
- 不再画中心小圆点、白色描边、"极佳/良好/一般/较弱/很差 -28" 等文字
- 只保留径向渐变色块,颜色本身已能反映信号强度(红=弱,绿=强)
3. 禁用 ViewPager2 滑动手势
- 任何手势(单指/双指)都不再切换 Tab
- 只能通过点击顶部 Tab 标签切换"实时信号 / 信号热力图"
- 热力图页的拖动和缩放手势完全受 HeatMapView 控制,不再被父级拦截
v1.8.3 修复热力图拖动切 Tab 问题
修复:WiFi 热力图拖动时整个屏幕被跟着拖
问题
- 在热力图页拖动地图时,左右滑动会被 ViewPager2 拦截,导致切到「实时信号」Tab
- 双指缩放时也可能触发同样问题
修复
- 在 HeatMapView.onTouchEvent 中,当检测到双指缩放或已放大后的单指拖动时,调用
parent.requestDisallowInterceptTouchEvent(true)阻止父级(ViewPager2)拦截触摸事件 - 手指抬起后恢复
requestDisallowInterceptTouchEvent(false),此时左右滑动可正常切 Tab - 未放大时(userScale ≈ 1)单指滑动仍允许 ViewPager2 切 Tab,避免影响正常翻页
v1.8.2 WiFi 热力图双指缩放
改进:WiFi 热力图删除手动模式 + 双指缩放
改动
- 删除手动模式:不再需要点击地图标记,直接自动采样
- 双指捏合缩放:地图支持 0.3x ~ 8x 缩放,放大后可看清聚集的点
- 单指拖动平移:放大后可拖动查看不同区域
- 重置视图按钮:底部新增「重置视图」按钮,一键恢复到自动 fit 状态
- 采样点位置改为世界坐标累加:每次采样点位置 = 上次位置 + 随机方向 0.3~0.6 米,点自然散开
- 缩放足够大时才显示标签:避免缩小时文字挤一起
- 网格随缩放自适应:每 1 米一条网格线,缩太小自动隐藏
v1.8.1 WiFi 热力图手动/自动模式切换
改进:WiFi 热力图新增手动/自动模式切换
问题
- v1.8.0 默认是自动模式,所有点都聚集在地图中心,看不清
- 没有明确的手动模式入口
改进
- 新增模式切换按钮:底部新增「手动模式 / 自动模式」切换按钮
- 手动模式(默认):
- 走到一个位置后点击地图任意位置,在该点标记当前 RSSI
- 点散布在用户点击的各个位置,自然占满屏幕
- 底部提示「点击地图任意位置标记当前位置的信号」
- 自动模式:
- 每 1.5 秒自动采集一个点,位置在上次采样点附近随机抖动
- 切换到自动模式后自动开始采样,再点「停止」可暂停
- 底部提示「自动采样中,每 1.5 秒采集一个点」
- 云块半径从 180px 调小到 120px,单个采样点更清晰
- 「开始/停止」按钮仅在自动模式显示,手动模式不需要
v1.8.0 WiFi 热力图改为点状云模式
重做:WiFi 信号热力图改为点状云模式
问题
- 原 PDR 步行推算不灵敏,原地晃手机会误判步数画出错误轨迹
- 信息复杂(步数/距离),用户看不懂
改进
- 抛弃 PDR 算法,删除 PdrTracker.kt
- 改为点状云热力图:每个采样点画径向渐变色块,多个色块自然叠加形成云状热力图
- 两种采样模式:
- 手动:走到一个位置后点击地图,在点击位置标记当前 RSSI
- 自动:点「开始探测」每 1.5 秒在地图中心自动采一个点(带随机抖动避免重叠)
- 简化信息:只显示信号等级文字(极佳/良好/一般/较弱/很差)+ RSSI 数值,不再显示步数/距离
- 色块半径 180px,半透明叠加,类似天气预报热力图
- 红→黄→绿三色渐变表示信号弱→强
v1.7.4 修复 WiFi 频段格式化崩溃
修复
- 修复 WiFi 信号探测器点击"开始探测"时弹出"启动失败: IllegalFormatConversionException: f"的问题
- 根因:strings.xml 中
wifi_freq资源%1$s %.1f GHz混用了显式编号(%1$s)和隐式编号(%.1f),Android Formatter 在混合使用时会错位,把 String 参数误传给 %f 占位符 - 修复:统一使用显式编号
%1$s %2$.1f GHz