确定设备是否已移动

时间:2013-02-19 07:48:52

标签: android gyroscope

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

2 个答案:

答案 0 :(得分:1)

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

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

监控接近传感器可能有一些用处,但任何阻挡它的东西都会触发它,并且它实际上并没有告诉您手机是否正在移动。

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

答案 1 :(得分: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;
}