Android 确定设备是否已移动

Android 确定设备是否已移动,android,gyroscope,Android,Gyroscope,如何确定Android设备是否已移动?所谓“移动”,我的意思是,如果它仍然躺在桌子上,有人捡起它,我可以检测到它已经移动了。我曾考虑使用陀螺仪传感器,但不确定这是否是最佳解决方案。如果要检测最小运动,我认为您没有太多选择。陀螺仪/加速计传感器是一个不错的选择。即使在那里,您也需要添加一些滤波,因为加速度计有一些波动 全球定位系统(GPS)不够精确,不足以用来注意桌子和手之间的移动 监控接近传感器可能有一些用处,但任何阻塞都会触发它,并且它实际上不会告诉您手机是否正在移动 如果您想消耗大量电池,请

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

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

全球定位系统(GPS)不够精确,不足以用来注意桌子和手之间的移动

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


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

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

若向量和等于重力,且为+/-阈值,则其稳定值在表上

代码如下所示(注:下面的移动平均值表示50个加速计样本的移动平均值)

bool IsDeviceStill(常数传感器事件和事件)
{
if(event.type==传感器类型加速计){
const vec3_t acc(事件数据);
/*避免平方根以获得更好的性能*/
浮动向量和=acc.x*acc.x+acc.y*acc.y+acc.z*acc.z;
向量3_t方差=向量方差->移动平均值(向量和);
vec3_t var=mOffsetAvg->movingAverage(abs(variance.x-vecsum));
ALOGE(“当前方差x:%f平均方差:%f”,方差x,变量x);
如果(var.x<2)/*阈值为2,则标准偏差应小于2*/
mDeviceStill=true;
其他的
mDeviceStill=false;
}
ALOGE(“%s设备仍然为:%d\n”,_u函数,mDeviceStill);
返回mDeviceStill;
}

嗨,你有什么解决办法吗?我试图用后台服务做同样的事情,但当屏幕关闭时,加速计不工作。
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;
}