После множества проб и ошибок с различными устройствами, я думаю, теперь у меня есть приблизительное представление:
Во-первых, из этого сообщения на форуме разработчиков Android:
TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR являются «объединенными» датчиками, которые возвращают соответственно линейное ускорение, гравитацию и вектор вращения (кватернион). не определено, как они реализуются. На некоторых устройствах они реализованы в ч / б, на некоторых устройствах используются акселерометр + магнитометр, на некоторых других устройствах используется гироскоп.
Так вот что.
Методом проб и ошибок я обнаружил, что устройства только с акселерометром не предоставляют датчик LINEAR_ACCELERATION (могут быть исключения, некоторые устройства могут все еще иметь датчик, но ни одно из устройств, которые я пробовал, не имеет тот).
Итак, чтобы получить датчик LINEAR_ACCELERATION, у вас должен быть как минимум магнитометр или гироскоп, что очень редко встречается в смартфонах стоимостью менее 8000 индийских рупий (120 долларов США).
Теперь не часть вопроса, а как написать код для работы на обоих этих типах устройств?
Что ж, в итоге я сделал следующее:
Сначала проверьте, есть ли в устройстве датчик:
Sensor linearAcceleration = sMgr.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
if (linearAcceleration==null){
hasLinearAccSensor = false;
}
else {
hasLinearAccSensor = true;
}
Если есть сенсор, то круто! но если вы этого не сделаете, вы можете использовать датчик TYPE_ACCELEROMETER и самостоятельно отработать линейное ускорение. Что-то вроде этого :
public void processPseudoAcceleration(SensorEvent event)
{
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final float alpha = 0.8f;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
float linear_acceleration[] = {0,0,0};
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
setAccValues(linear_acceleration[0],linear_acceleration[1],linear_acceleration[2]);
}
Но обратите внимание, что в моем тесте я обнаружил, что эта функция не так надежна, как фактические показания датчика, но она подходит для большинства приложений.
Надеюсь, кто-то сочтет это полезным. Ваше здоровье.
person
ShahiM
schedule
29.08.2016