2013-02-19 162 views
0

如何確定Android設備是否已移動?通過「移動」,我的意思是,如果它躺在桌子上,有人拿起它,我可以檢測到它已經移動。我正在考慮使用陀螺儀傳感器,但我不確定這是否是最好的解決方案。確定設備是否已移動

+0

嗨,你是否有什麼解決辦法嗎?我正在嘗試使用後臺服務來做同樣的事情,但在關閉屏幕時加速度計不起作用。 – Nitish 2014-07-17 03:09:17

回答

1

如果你想檢測最小的移動,我不認爲你有很多選擇。陀螺儀/加速度傳感器是最好的選擇。即使在那裏你也需要添加一些過濾器,因爲加速度計有一些搖擺。

GPS幾乎不夠準確,無法用來注意桌面之間的移動。

監測接近傳感器可能有些用處,但是任何阻塞都會觸發它,而且它確實不會告訴您手機是否正在移動。

如果您想消耗大量電池,請使用相機。通過過濾器對一些輸入進行流式傳輸,以確定圖像是否正在移動。

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; 
} 
相關問題