QSL4A 传感器访问——用 Python 读取加速度计、陀螺仪、GPS
Android 传感器分类
Android 设备上的传感器大致分为四类:
| 类别 | 常见传感器 | 用途 |
|---|---|---|
| 动作类 | 加速度计、陀螺仪、重力计、旋转矢量 | 检测设备的运动状态 |
| 位置类 | GPS、磁力计、方向传感器 | 检测设备的位置和朝向 |
| 环境类 | 光线、接近、温度、气压、湿度 | 检测周围环境条件 |
| 医疗类 | 心率传感器 | 少数设备有 |
QSL4A 提供了统一的传感器读取接口,让你用相同的方式访问不同类型的传感器。
传感器的基本用法
启动传感器监听
droid.startSensingTimed(1, 1000)
第一个参数 1 是传感器类型(具体类型编号见下文),第二个 1000 是采样间隔(毫秒)。上面这行意思是:启用传感器类型 1(加速度计),每 1000 毫秒读一次。
读取传感器数据
启动监听后,传感器数据会被推送到事件队列里。有两种方式获取:
方式一:事件轮询
import time
while True:
events = droid.sensorsGetEventBuffered().result
if events:
for event in events:
print(event) # event 包含时间戳、传感器类型、x/y/z 值
time.sleep(1)
方式二:定时主动获取
某些 QSL4A 版本提供主动拉取的 API,比如 droid.sensorsGetAcceleration() 直接返回当前加速度值。具体以实际版本为准。
停止监听
droid.stopSensing()
用完一定要停,否则传感器持续耗电,会快速消耗手机电量。
常用传感器详解
加速度计(Accelerometer)
传感器类型编号通常为 1。返回三个方向(x、y、z)的加速度值,单位是 m/s²。静止时 z 轴会是 9.8(重力)。
droid.startSensingTimed(1, 500)
# 读取事件...
droid.stopSensing()
用途:步数统计、设备晃动检测、横竖屏判断辅助。
陀螺仪(Gyroscope)
传感器类型编号通常为 4。返回三个方向的角速度(旋转速度),单位是弧度/秒。
用途:游戏控制、AR 应用、精确姿态检测。
GPS 定位
GPS 不是通过 startSensing 启动的,而是有专门的 API:
droid.startLocating() # 启动 GPS 定位服务
# 等几秒让 GPS 搜星
location = droid.getLastKnownLocation().result
print(f"经度: {location.get('longitude')}, 纬度: {location.get('latitude')}")
print(f"精度: {location.get('accuracy')} 米")
droid.stopLocating()
GPS 第一次启动需要几秒到几十秒搜星,有延迟。如果对实时性要求不高,可以先用网络定位(更快但精度低)。
光线传感器
返回当前环境光照强度(单位:勒克斯)。可以用来判断白天还是夜间,自动调整屏幕亮度。
接近传感器
检测手机前方是否有物体靠近(比如打电话时贴到耳朵),返回 0(靠近)或 1(远离)。
权限需求
| 传感器 | 需要的权限 |
|---|---|
| 加速度计、陀螺仪、光线、接近 | 无额外权限(QPython App 自带) |
| GPS | 精确位置 + 粗略位置 |
省电最佳实践
传感器是手机上最耗电的组件之一(仅次于屏幕和蜂窝网络):
- 不用就关:读完数据立即
stopSensing()/stopLocating() - 降低采样频率:除非实时性要求高,否则 1000ms(1 秒)一次足够
- 避免后台长时间监听:如果脚本要持续监听,需要申请前台服务权限
- GPS 尽量用网络定位:GPS 搜星慢、耗电多,网络定位(基站 + Wi-Fi)更快更省电
实际应用例子
步数计数器原型
from androidhelper import Android
import time
droid = Android()
droid.startSensingTimed(1, 200) # 200ms 采样一次
previous_z = 0
step_count = 0
try:
while True:
events = droid.sensorsGetEventBuffered().result
if events:
for event in events:
z = event.get("z", 9.8)
# 简化的步数检测逻辑:z 轴加速度超过阈值且方向变化
if abs(z - previous_z) > 2.0 and z < 9.0:
step_count += 1
droid.makeToast(f"步数: {step_count}")
previous_z = z
time.sleep(0.2)
except KeyboardInterrupt:
droid.stopSensing()
print(f"总步数: {step_count}")
这是一个简化示例,实际步数检测需要更复杂的滤波算法。但它展示了 QSL4A 传感器 API 的基本使用范式。
小结
QSL4A 的传感器 API 让移动端 Python 编程有了独特价值——PC 上做不到的硬件数据采集,在手机上几行代码就能实现。启动 → 轮询/获取数据 → 停止 三步是所有传感器的基本模式,关键是记得及时停止以省电。
继续看 摄像头调用 了解如何用 Python 控制拍照和录像。