ARMCLOUD 开发者文档中心
  • 简体中文
  • English
  • 简体中文
  • English
  • 产品介绍
  • 产品计费
  • 服务端 OpenAPI
    • 使用指南
    • 接口签名v1.0
    • 接口文档
    • 错误码说明
    • 回调业务类型码
    • 实例列表
    • 安卓改机属性列表
    • 更新日志
  • Android端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Web H5端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Windows PC端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 更新日志
  • 端侧与云机通信开发
    • AIDL接入方式
    • 系统服务API(aidl)
  • 场景解决方案
    • 类XP、LSP Hook框架
    • 传感器数据动态仿真
  • 常见问题
    • 平台基础问题
    • 存储相关问题
    • 网络连接问题
    • 应用管理问题
    • 开发集成问题
    • 性能优化问题
    • 计费相关问题
    • 技术支持
  • 相关协议
    • 云手机SDK隐私政策

简介

ARMCLOUD 云手机支持对移动设备的各种传感器进行动态数据仿真,包括重力感应、陀螺仪、磁力计、加速度计等。通过模拟真实的传感器数据,可以为各种应用场景提供逼真的设备状态模拟。

支持的传感器类型

1. 运动传感器

加速度计 (acceleration)

  • 格式:acceleration:x:y:z
  • 功能:模拟设备在 X、Y、Z 三轴上的加速度变化
  • 单位:m/s²
  • 应用场景:重力感应游戏、计步器应用、屏幕旋转控制

线性加速度计 (linear-acceleration)

  • 格式:linear-acceleration:x:y:z
  • 功能:模拟去除重力影响后的线性加速度
  • 单位:m/s²
  • 应用场景:精确运动检测、手势识别

未校准加速度计 (acceleration-uncalibrated)

  • 格式:acceleration-uncalibrated:x:y:z
  • 功能:包含偏差的原始加速度数据
  • 单位:m/s²

陀螺仪 (gyroscope)

  • 格式:gyroscope:x:y:z
  • 功能:模拟设备绕三轴的角速度变化
  • 单位:rad/s
  • 应用场景:体感游戏、VR/AR 应用、相机防抖

未校准陀螺仪 (gyroscope-uncalibrated)

  • 格式:gyroscope-uncalibrated:x:y:z
  • 功能:包含偏差的原始陀螺仪数据
  • 单位:rad/s

重力传感器 (gravity)

  • 格式:gravity:x:y:z
  • 功能:模拟重力在设备坐标系中的分量
  • 单位:m/s²
  • 应用场景:水平仪应用、姿态检测

2. 位置传感器

磁力计 (magnetic-field)

  • 格式:magnetic-field:x:y:z
  • 功能:模拟设备检测磁场强度和方向
  • 单位:μT (微特斯拉)
  • 应用场景:指南针应用、导航软件、金属探测器

未校准磁力计 (magnetic-field-uncalibrated)

  • 格式:magnetic-field-uncalibrated:x:y:z
  • 功能:包含偏差的原始磁场数据
  • 单位:μT

方向传感器 (orientation)

  • 格式:orientation:azimuth:pitch:roll
  • 功能:模拟设备的欧拉角姿态
  • 单位:度 (已废弃,建议使用旋转向量)

3. 旋转传感器

旋转向量 (rotation-vector)

  • 格式:rotation-vector:x:y:z
  • 功能:模拟设备的旋转状态(四元数的前三个分量)
  • 应用场景:3D 应用、VR/AR、姿态控制

游戏旋转向量 (game-rotation-vector)

  • 格式:game-rotation-vector:x:y:z
  • 功能:不使用磁力计的旋转向量
  • 应用场景:游戏控制、防磁干扰场景

地磁旋转向量 (geomagnetic_roation)

  • 格式:geomagnetic_roation:x:y:z
  • 功能:基于加速度计和磁力计的旋转向量
  • 应用场景:指南针、导航应用

4. 环境传感器

光线传感器 (light)

  • 格式:light:value
  • 功能:模拟环境光照强度
  • 单位:lux (勒克斯)
  • 应用场景:屏幕亮度自动调节、拍照场景检测

距离传感器 (proximity)

  • 格式:proximity:distance
  • 功能:模拟物体与设备的距离
  • 单位:cm
  • 应用场景:通话时屏幕关闭、手势控制

温度传感器 (temperature)

  • 格式:temperature:value
  • 功能:模拟环境温度
  • 单位:℃
  • 应用场景:天气应用、温度监控

气压传感器 (pressure)

  • 格式:pressure:value
  • 功能:模拟大气压强
  • 单位:hPa (百帕)
  • 应用场景:高度测量、天气预测

湿度传感器 (humidity)

  • 格式:humidity:value
  • 功能:模拟相对湿度
  • 单位:% (相对湿度百分比)
  • 应用场景:天气应用、室内环境监测

5. 运动检测传感器

计步器 (step-counter)

  • 格式:step-counter:count
  • 功能:累计步数统计
  • 单位:步数 (整数)
  • 应用场景:健康应用、运动跟踪

步行检测器 (step-detector)

  • 格式:step-detector:value
  • 功能:检测每一步的发生
  • 应用场景:实时步行检测、运动分析

显著运动检测 (significant-motion)

  • 格式:significant-motion:value
  • 功能:检测设备的显著移动
  • 应用场景:省电模式、位置更新触发

运动检测 (motion-detect)

  • 格式:motion-detect:value
  • 功能:通用运动检测
  • 应用场景:安全监控、节能控制

倾斜检测器 (tilt-detector)

  • 格式:tilt-detector:value
  • 功能:检测设备倾斜状态变化
  • 应用场景:屏幕方向锁定、倾斜控制

拿起手势 (pick-up)

  • 格式:pick-up:value
  • 功能:检测设备被拿起的动作
  • 应用场景:自动亮屏、手势唤醒

6. 生物传感器

心率传感器 (heart-rate)

  • 格式:heart-rate:bpm
  • 功能:模拟心率数据
  • 单位:BPM (每分钟心跳次数)
  • 应用场景:健康监测、运动跟踪

7. 可折叠设备传感器

铰链角度传感器 (hinge-angle0/1/2)

  • 格式:hinge-angle0:angle、hinge-angle1:angle、hinge-angle2:angle
  • 功能:模拟可折叠设备的折叠角度
  • 单位:度
  • 应用场景:折叠屏设备适配、多屏显示控制

8. 可穿戴设备传感器

手腕倾斜手势 (wrist-tilt)

  • 格式:wrist-tilt:value:measurementId
  • 功能:检测手腕抬起动作
  • 应用场景:智能手表亮屏、手势识别

使用方式

通过系统属性配置(推荐方式)

1. 设置系统属性

通过设置系统属性指定传感器数据文件路径:

setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/sensor1.txt

2. 创建传感器数据文件

在指定路径创建传感器数据文件,格式如下:

# /data/local/tmp/sensor1.txt
acceleration:-0.62871414:2.946163:9.217153
gyroscope:-3.625:-0.8125:1.2125
magnetic-field:1.4375:24.475:-18.362501
delay:50
acceleration:-0.52871414:2.846163:9.317153
gyroscope:-3.525:-0.7125:1.3125
magnetic-field:1.5375:24.575:-18.262501
delay:50

3. 数据文件格式说明

三轴传感器 (x:y:z 格式)
传感器类型格式示例单位说明
accelerationacceleration:-0.628:2.946:9.217m/s²加速度计数据
linear-accelerationlinear-acceleration:0.1:-0.2:0.05m/s²线性加速度
acceleration-uncalibratedacceleration-uncalibrated:-0.63:2.95:9.22m/s²未校准加速度
gyroscopegyroscope:-3.625:-0.8125:1.2125rad/s陀螺仪数据
gyroscope-uncalibratedgyroscope-uncalibrated:-3.62:-0.81:1.21rad/s未校准陀螺仪
gravitygravity:0.0:0.0:9.8m/s²重力传感器
magnetic-fieldmagnetic-field:1.4375:24.475:-18.3625μT磁力计数据
magnetic-field-uncalibratedmagnetic-field-uncalibrated:1.44:24.48:-18.36μT未校准磁力计
orientationorientation:45.0:10.5:-5.2度方向传感器 (已废弃)
rotation-vectorrotation-vector:0.1:0.2:0.3-旋转向量
game-rotation-vectorgame-rotation-vector:0.15:0.25:0.35-游戏旋转向量
geomagnetic_roationgeomagnetic_roation:0.12:0.22:0.32-地磁旋转向量
单值传感器 (value 格式)
传感器类型格式示例单位说明
lightlight:500.0lux光线强度
proximityproximity:0.0cm距离传感器
temperaturetemperature:25.5℃环境温度
pressurepressure:1013.25hPa大气压强
humidityhumidity:65.0%相对湿度
step-counterstep-counter:1250步累计步数
step-detectorstep-detector:1.0-步行检测
significant-motionsignificant-motion:1.0-显著运动
motion-detectmotion-detect:1.0-运动检测
tilt-detectortilt-detector:1.0-倾斜检测
pick-uppick-up:1.0-拿起手势
heart-rateheart-rate:72.0BPM心率
hinge-angle0hinge-angle0:90.0度铰链角度0
hinge-angle1hinge-angle1:45.0度铰链角度1
hinge-angle2hinge-angle2:0.0度铰链角度2
特殊格式传感器
传感器类型格式示例说明
wrist-tiltwrist-tilt:1.0:12345手腕倾斜:数值:测量ID
delaydelay:50延时间隔,单位:毫秒

4. 文件限制

  • 最大文件大小:1GB
  • 支持格式:纯文本文件
  • 编码要求:UTF-8
  • 权限要求:文件必须具有可读权限

数据采集与生成

1. 真机数据采集

可以通过真实设备采集传感器数据来生成仿真文件:

Android 数据采集示例

public class SensorDataCollector implements SensorEventListener {
    private SensorManager sensorManager;
    private FileWriter fileWriter;
    
    public void startCollection() {
        try {
            fileWriter = new FileWriter("/sdcard/sensor_data.txt");
            sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            
            // 注册传感器监听器
            sensorManager.registerListener(this, 
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_GAME);
            sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                SensorManager.SENSOR_DELAY_GAME);
            sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME);
                
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void onSensorChanged(SensorEvent event) {
        try {
            String line = "";
            switch (event.sensor.getType()) {
                case Sensor.TYPE_ACCELEROMETER:
                    line = String.format("acceleration:%.8f:%.8f:%.8f\n",
                        event.values[0], event.values[1], event.values[2]);
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    line = String.format("gyroscope:%.8f:%.8f:%.8f\n",
                        event.values[0], event.values[1], event.values[2]);
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    line = String.format("magnetic-field:%.8f:%.8f:%.8f\n",
                        event.values[0], event.values[1], event.values[2]);
                    break;
            }
            
            fileWriter.write(line);
            fileWriter.write("delay:50\n");
            fileWriter.flush();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 数据文件生成脚本

Python 脚本示例

#!/usr/bin/env python3
import math
import time

def generate_rotation_data(output_file):
    """生成设备旋转的传感器数据"""
    with open(output_file, 'w') as f:
        for angle in range(0, 361, 5):  # 0到360度,每5度一个数据点
            rad = math.radians(angle)
            
            # 模拟重力在不同角度下的分解
            acc_x = 9.8 * math.sin(rad)
            acc_y = 0
            acc_z = 9.8 * math.cos(rad)
            
            # 模拟旋转时的角速度
            gyro_x = 0.1 if angle < 180 else -0.1
            gyro_y = 0
            gyro_z = 0
            
            # 磁力计数据保持相对稳定
            mag_x = 25.0 * math.cos(rad)
            mag_y = 25.0 * math.sin(rad)
            mag_z = -18.0
            
            f.write(f"acceleration:{acc_x:.6f}:{acc_y:.6f}:{acc_z:.6f}\n")
            f.write(f"gyroscope:{gyro_x:.6f}:{gyro_y:.6f}:{gyro_z:.6f}\n")
            f.write(f"magnetic-field:{mag_x:.6f}:{mag_y:.6f}:{mag_z:.6f}\n")
            f.write("delay:100\n")

def generate_shake_data(output_file):
    """生成摇一摇手势的传感器数据"""
    with open(output_file, 'w') as f:
        for shake in range(10):  # 10次摇动
            # 向左摇
            f.write("acceleration:-15.0:0.0:9.8\n")
            f.write("gyroscope:0.0:0.0:5.0\n")
            f.write("magnetic-field:1.4375:24.475:-18.362501\n")
            f.write("delay:100\n")
            
            # 向右摇
            f.write("acceleration:15.0:0.0:9.8\n")
            f.write("gyroscope:0.0:0.0:-5.0\n")
            f.write("magnetic-field:1.4375:24.475:-18.362501\n")
            f.write("delay:100\n")
            
            # 回到静止
            f.write("acceleration:0.0:0.0:9.8\n")
            f.write("gyroscope:0.0:0.0:0.0\n")
            f.write("magnetic-field:1.4375:24.475:-18.362501\n")
            f.write("delay:200\n")

# 使用示例
generate_rotation_data("/data/local/tmp/rotation.txt")
generate_shake_data("/data/local/tmp/shake.txt")

动态仿真场景

1. 设备旋转模拟

使用数据文件方式

# 1. 生成旋转数据文件
python3 generate_rotation.py

# 2. 上传到云手机
adb push rotation.txt /data/local/tmp/

# 3. 设置系统属性启用仿真
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/rotation.txt

# 4. 重启目标应用查看效果
adb shell am force-stop com.example.app
adb shell am start com.example.app/.MainActivity

2. 摇一摇手势模拟

# 使用预生成的摇一摇数据文件
adb push shake.txt /data/local/tmp/
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/shake.txt

# 启动微信等支持摇一摇的应用进行测试
adb shell am start com.tencent.mm/.ui.LauncherUI

## 实际操作流程

### 1. 完整操作示例

```bash
# 连接到云手机
adb connect your-cloud-phone-ip:5555

# 上传准备好的传感器数据文件
adb push sensor_walking.txt /data/local/tmp/

# 设置文件可读权限
adb shell chmod 644 /data/local/tmp/sensor_walking.txt

# 设置系统属性
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/sensor_walking.txt

# 验证属性设置
adb shell getprop persist.sys.cloud.sensor.tpl_dp

# 重启目标应用以使传感器数据生效
adb shell am force-stop com.example.walkingapp
adb shell am start com.example.walkingapp/.MainActivity

# 查看应用日志验证效果
adb logcat | grep SensorManager

2. 切换不同场景数据

# 切换到摇一摇数据
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/shake.txt

# 切换到旋转数据  
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/rotation.txt

# 停用传感器仿真(清空属性)
adb shell setprop persist.sys.cloud.sensor.tpl_dp ""

最佳实践

1. 数据文件管理

  • 命名规范:使用有意义的文件名,如 walking_5min.txt、car_driving.txt
  • 数据完整性:确保每组传感器数据都有对应的 delay 值
  • 文件大小:合理控制文件大小,避免接近 1GB 限制影响性能

2. 数据合理性

  • 加速度计:静止状态下 Z 轴应约为 9.8m/s²(重力加速度)
  • 陀螺仪:静止状态下三轴数值应接近 0
  • 磁力计:典型地球磁场强度约为 25-65μT

3. 更新频率优化

  • 游戏类应用:建议 delay:16 (60Hz)
  • 导航类应用:建议 delay:200-1000 (1-5Hz)
  • 一般应用:建议 delay:50-100 (10-20Hz)

4. 数据平滑性

在生成数据文件时,确保数值之间的平滑过渡:

# 平滑过渡示例
def smooth_transition(start_value, end_value, steps):
    """在两个数值之间进行平滑插值"""
    return [start_value + (end_value - start_value) * i / steps 
            for i in range(steps + 1)]

# 应用到传感器数据生成
for i, acc_x in enumerate(smooth_transition(0, 9.8, 20)):
    with open('smooth_data.txt', 'a') as f:
        f.write(f"acceleration:{acc_x:.6f}:0.0:9.8\n")
        f.write("delay:50\n")

应用案例

1. 游戏测试

  • 模拟不同的设备姿态来测试重力感应游戏
  • 批量测试设备旋转对游戏界面的影响

2. 导航应用测试

  • 模拟复杂的行驶路线测试导航准确性
  • 测试不同位置下的地图显示效果

3. 健康应用测试

  • 模拟步行、跑步等运动状态
  • 测试计步器和运动轨迹记录功能

注意事项

  1. 性能影响:频繁的传感器数据更新可能影响系统性能,请根据实际需求调整更新频率

  2. 应用权限:确保目标应用已获得相应的传感器使用权限

  3. 数据一致性:不同传感器的数据应保持物理上的一致性,避免冲突的数据组合

  4. 应用兼容性:部分老版本应用可能对某些传感器数据支持有限

  5. 机型兼容性:云手机传感器支持情况取决于所模拟的真实机型,部分传感器仅在特定机型下可用:

    • humidity (湿度传感器) - 大部分中低端机型不支持
    • temperature (温度传感器) - 仅部分高端机型支持
    • heart-rate (心率传感器) - 主要存在于三星Galaxy系列等特定机型
    • tilt-detector (倾斜检测器) - 部分机型的陀螺仪实现可能不支持
    • motion-detect (运动检测) - 依赖设备的运动协处理器
    • hinge-angle0/1/2/3 (铰链角度传感器) - 仅可折叠设备支持,如Samsung Galaxy Fold、华为Mate X等

    建议:选择合适的机型模板,或在使用前验证当前云机实例所模拟的机型是否支持目标传感器

故障排除

常见问题

Q: 设置传感器数据后应用没有响应

A: 检查应用是否已获得传感器权限,或尝试重启应用以重新初始化传感器监听

Q: 数据更新不平滑,出现跳跃

A: 适当降低更新频率,或在数据间增加插值过渡

Q: 系统属性设置后传感器仿真不生效

A: 检查系统属性路径是否正确,确认数据文件存在且具有可读权限 (chmod 644),验证文件格式正确,可尝试重启目标应用

Q: 某些传感器数据设置后应用仍无响应

A: 可能是当前云机实例模拟的机型不支持该类型传感器。特别是湿度、温度、心率、铰链角度等传感器,仅在特定真实机型上存在,云机会根据所模拟的机型决定传感器支持情况。建议先使用基础传感器(加速度计、陀螺仪、磁力计)进行测试,或选择支持目标传感器的机型模板

Prev
类XP、LSP Hook框架