确定设备是否已移动
问题描述:
如何确定Android设备是否已移动?通过“移动”,我的意思是,如果它躺在桌子上,有人拿起它,我可以检测到它已经移动。我正在考虑使用陀螺仪传感器,但我不确定这是否是最好的解决方案。确定设备是否已移动
答
如果你想检测最小的移动,我不认为你有很多选择。陀螺仪/加速度传感器是最好的选择。即使在那里你也需要添加一些过滤器,因为加速度计有一些摇摆。
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;
}
嗨,你是否有什么解决办法吗?我正在尝试使用后台服务来做同样的事情,但在关闭屏幕时加速度计不起作用。 – Nitish 2014-07-17 03:09:17