Galaxy Nexus: очень медленные показания сенсора

У меня действительно странная проблема с моим Samsung Galaxy Nexus — я пытаюсь прочитать некоторые значения датчика, например. от гироскопа. Очень простой код, просто прослушиватель датчика, помещающий значение в список после простой интеграции с течением времени.

Когда я запускаю код на Nexus S примерно на 60 секунд, я могу зарегистрировать около 60 000 событий датчика (SENSOR_DELAY_FASTEST), но если я запускаю его на Galaxy Nexus, я получаю только около 6000 значений за 60 секунд.

Есть ли способ увеличить это? Мне действительно нужно больше данных датчиков для того, что я делаю, и, кроме устройства, единственная разница — это версия ОС: 4.0.2 на Galaxy Nexus — 4.0.3 на Nexus S.

Любой совет будет принят во внимание!

Изменить - код:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
LogSensorEventListener listener = new LogSensorEventListener(
       SensorLoggerActivity.this, Sensor.TYPE_GYROSCOPE);
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
       SensorManager.SENSOR_DELAY_FASTEST);

LogSensorEventListener также является очень простой реализацией SensorEventListenerInterface:

@Override
public void onSensorChanged(SensorEvent event) {

    final float dT = (event.timestamp - mTimestamp) / 1000000000.f;
    if (dT < 1) { // just a fix for the first step

        mRelZ += event.values[2] * dT;
        list.add(mRelZ);
        list2.add(event.timestamp);
    }
    mTimestamp = event.timestamp;

mRelZ изначально установлен на 0, и два списка должны отслеживать время и измеренное значение. Если я закончил с моим измерением (нажав кнопку), значения записываются в файл:

    try {

        for (int i = 0; i < list.size(); i++) {

            long time = list2.get(i);

            if (mStartTime < 0) {
                mStartTime = time;
                time = 0;
            } else {
                time = time - mStartTime;
            }

            float timef = time / 1000000000.0f;
            sb.append(timef);
            sb.append(";");
            sb.append(Math.toDegrees(list.get(i)));
            sb.append("\n");
        }

        mOutFileStream.write(sb.toString().getBytes());

        mOutFileStream.flush();
        mOutFileStream.close();
    } catch (IOException e) {
    }

person fkerber    schedule 23.03.2012    source источник
comment
Вам нужно больше кристаллов дилития... и, может быть, показать нам свой код?   -  person Graham Smith    schedule 23.03.2012
comment
Я добавил код, но, как уже было сказано, в нем нет ничего особенного, и он отлично и очень быстро работает на Nexus S, но очень медленно на Galaxy Nexus... кстати. не имеет значения, включен кабель питания или нет   -  person fkerber    schedule 23.03.2012


Ответы (1)


У устройств Android нет стандартов того, как и когда они сообщают об изменениях датчиков. Например, некоторые устройства не будут сообщать об изменениях, если они НЕ ЕСТЬ (например, устройство движется). Некоторые устройства будут сообщать о множестве изменений, а другие о меньшем количестве изменений, даже если вы используете задержку, например. SensorManager.SENSOR_DELAY_FASTEST.

person Jon Willis    schedule 23.03.2012
comment
Даже если я все время вращаю прибор, иногда медленно, иногда быстро, во всех возможных направлениях ничего не меняется - я получаю только около 6000 измерений за 60 секунд. Так что, кажется, я должен признать, что Galaxy Nexus будет сообщать только о 100 измерениях в секунду, тогда как Nexus S может показывать 1000? - person fkerber; 24.03.2012
comment
По сути, да. Кажется логичным, что он ограничен аппаратным обеспечением, но также может быть ограничен программным обеспечением в некоторых ПЗУ. - person Jon Willis; 24.03.2012