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