确定设备是否已移动

问题描述:

如何确定Android设备是否已移动?通过“移动”,我的意思是,如果它躺在桌子上,有人拿起它,我可以检测到它已经移动。我正在考虑使用陀螺仪传感器,但我不确定这是否是最好的解决方案。确定设备是否已移动

+0

嗨,你是否有什么解决办法吗?我正在尝试使用后台服务来做同样的事情,但在关闭屏幕时加速度计不起作用。 – Nitish 2014-07-17 03:09:17

如果你想检测最小的移动,我不认为你有很多选择。陀螺仪/加速度传感器是最好的选择。即使在那里你也需要添加一些过滤器,因为加速度计有一些摇摆。

GPS几乎不够准确,无法用来注意桌面之间的移动。

监测接近传感器可能有些用处,但是任何阻塞都会触发它,而且它确实不会告诉您手机是否正在移动。

如果您想消耗大量电池,请使用相机。通过过滤器对一些输入进行流式传输,以确定图像是否正在移动。

你可以使用加速度计来解决这个问题。如果设备上没有外力,则加速计传感器值的矢量和将仅为重力。如果重力矢量发生变化,那么就有一个力量。如果这个力量很大,你可以假设设备正在移动。

如果矢量和等于+/- +/-阈值的重力,它稳定地躺在桌子上。

代码看起来像下面,(注:以下MovingAverage手段移动的加速度计的50个样本平均)

bool IsDeviceStill(const sensors_event_t& event) 
{ 
    if (event.type == SENSOR_TYPE_ACCELEROMETER) { 
     const vec3_t acc(event.data); 
     /*Avoiding square root for better performance*/ 
     float vecsum = acc.x*acc.x + acc.y*acc.y + acc.z*acc.z; 
     vec3_t variance = mVariance->movingAverage(vecsum); 

     vec3_t var = mOffsetAvg->movingAverage(abs(variance.x - vecsum)); 

     ALOGE("Current variance x:%f AvgVarianc:%f ",variance.x,var.x); 
     if(var.x < 2) /*Threshold is 2, Standard deviation should less than 2 */ 
      mDeviceStill = true; 
     else 
      mDeviceStill = false; 

    } 
    ALOGE("%s Device is still:%d\n", __FUNCTION__, mDeviceStill); 
    return mDeviceStill; 
}