0

如何确定 Android 设备是否已移动?“移动”是指如果它静止在桌子上并且有人捡起它,我可以检测到它已经移动。我正在考虑使用陀螺仪传感器,但不确定这是否是最佳解决方案。

4

2 回答 2

1

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

GPS 几乎不够准确,无法用于注意到从桌子到手的移动。

监控接近传感器可能会有一些用处,但任何会触发它的阻塞都不会告诉你手机是否在移动。

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

于 2013-02-19T07:58:34.257 回答
1

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

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

代码如下所示,(注意:下面的 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;
}
于 2014-10-30T04:23:23.917 回答