2

是否有可能将加速度计更新频率减慢到 1hz 以及如何?

我已经在 nexus 7 选项卡上尝试过:将 sensorDelay_Normal 更改为 1.000.000 但没有任何改变。谢谢你!

这是代码:

mAccelerometer.registerListener(listener,mAccelerometer.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.1000000);
4

5 回答 5

4

这就是我获得 1Hz 加速度的方式:

static int ACCE_FILTER_DATA_MIN_TIME = 1000; // 1000ms
long lastSaved = System.currentTimeMillis();

@Override
public void onSensorChanged(SensorEvent event) {
    if ((System.currentTimeMillis() - lastSaved) > ACCE_FILTER_DATA_MIN_TIME) {
        lastSaved = System.currentTimeMillis();
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
    }
}
于 2014-11-11T09:36:53.820 回答
0

您始终可以忽略测量值,但每秒一次除外。还是要备用电池?

于 2013-11-08T12:53:56.343 回答
0

好的,我找到了解决方案:

public static final double accFreq = 15; //15 = 1 sec
long nowA = 0;
long timeA = 0;
int tempA = 0;
public SensorEventListener listener = new SensorEventListener() {
        long tSA;

        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];

                // Get timestamp of the event
                tSA = event.timestamp;

                if (nowA != 0) {
                    tempA++;
                    if (tempA == settings.accFreq) {
                        timeA = tSA - nowA;
                        tempA = 0;

                        Log.e("Accelerometer:", "" + x + "  " + y + "  " + z);
                    }
                }
                if (tempA == 0) {
                    nowA = tSA;

                }

            }
}

这是我可以让它在 1Hz 下工作的唯一方法!

于 2013-11-10T20:42:22.037 回答
0

传感器速度值的自定义值效果不佳。

如果您查看该类,您会在每个 .registerListener() 方法中找到“getDelay”函数。

public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs,
        int maxBatchReportLatencyUs) {
        int delay = getDelay(rateUs);
        return registerListenerImpl(listener, sensor, delay, null,maxBatchReportLatencyUs, 0);
    }

Wich 也在同一个类中定义:

private static int getDelay(int rate) {
        int delay = -1;
        switch (rate) {
            case SENSOR_DELAY_FASTEST:
                delay = 0;
                break;
            case SENSOR_DELAY_GAME:
                delay = 20000;
                break;
            case SENSOR_DELAY_UI:
                delay = 66667;
                break;
            case SENSOR_DELAY_NORMAL:
                delay = 200000;
                break;
            default:
                delay = rate;
                break;
        }
        return delay;
    }

所以通常它应该可以设置自定义值。但是,如果您尝试使用高于约 100 毫秒(100000微秒)的自定义值,则事件之间的测量时间可能会跳到 1000 毫秒并停留在那里。如果您使用 1000 ,2000 或更高的毫秒数,则事件之间的时间仍然约为 1000 毫秒。

您可以使用 SENSOR_DELAY_NORMAL (= 200 毫秒)并通过每次检查(就像大卫所做的那样)通过足够的时间来捕获事件每次。

于 2015-04-03T21:20:08.857 回答
-1

使用当前方法,应用程序仍然每 60 毫秒获取一次事件。仅仅因为它丢弃了 15 个事件中的 14 个,并不能减少电池消耗,因为传感器硬件仍然需要每 60 毫秒处理一次数据,并且系统接收它并将其发送到应用程序。即没有太多的电池节省。

(nitpick alert)为了准确使用上述方法,需要从 16 或 17 个事件中挑选一个样本,因为每个事件平均发生在 60 毫秒左右。


在注册多个 sensorEventListener 时设备冻结SENSOR_DELAY_NORMAL不是 Android 框架的问题(它可以轻松处理该场景)。这表明应用程序的编写方式存在问题。首先要查找的是主 UI 线程中的大量 CPU 密集型代码。遵循开发人员指南,通过注册的多个 sensorEventListener()和多个执行 cpu 密集型计算的工作线程来使应用程序响应。SENSOR_DELAY_NORMAL

于 2013-11-11T04:23:31.720 回答