当前位置: 首页 > 知识库问答 >
问题:

Android-在registerListener()中使用用户定义的延迟。不工作,为什么?

巫欣荣
2023-03-14

我试图从Android手机传感器读取值。我初始化传感器如下:

private void sensorInit() {
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
            SensorManager.SENSOR_DELAY_FASTEST);
}

然后我可以得到~350个样本/秒。

但是为了节省电力,我希望能让它慢下来。所以我修改SensorManager。SENSOR_DELAY_FASTEST到1000。我希望传感器延迟为1000ms。但显然它不起作用,因为我仍然得到~350个样本/秒的速率。

从Android页面:

公共布尔寄存器监听器(SensorListener监听器,int传感器,int速率,处理程序处理程序)

参数

侦听器:传感器侦听器对象

传感器:要注册的传感器的位掩码

速率:事件的速率。这只是对系统的一个提示。接收事件的速度可能快于或慢于指定的速率。通常事件接收速度更快。该值必须是SENSOR\u DELAY\u NORMAL、SENSOR\u DELAY\u UI、SENSOR\u DELAY\u GAME或SENSOR\u DELAY\u faster中的一个。或者,事件之间所需的延迟(以微秒为单位)。以微秒为单位指定延迟仅适用于Android 2.3(API级别9)以后的版本。对于早期版本,必须使用传感器延迟常数之一。

处理程序:传感器事件将传递到的处理程序。

有人能帮我吗?

如何才能真正降低传感器采样速度以节省电源?提前谢谢。

共有3个答案

欧阳俊捷
2023-03-14

我在项目中使用的替代方案。事情是这样的:

  1. 设置一个报警(android.app.AlarmManager),该报警将每隔x秒重复一次
  2. 在报警寄存器ListeneronReceive中,使用方便的传感器设置
  3. 在传感器事件监听器的传感器更改中,根据需要使用事件的值。然后取消注册侦听器

步骤2和3将每隔x秒重复一次。

我希望我能粘贴在所有的代码,但它相当长,与其他功能交织在一起,我相信你可以在网上找到所有的细节。

彭风华
2023-03-14

尝试SensorManager。传感器延迟正常传感器管理器。传感器延迟用户界面

弘兴言
2023-03-14

贡献一点:

如果使用任何推荐值,例如SensorManager。传感器延迟正常传感器管理器。传感器_延迟_UI比将使用的传感器_延迟_UI大。如果您查看一下实现:

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;
    }

您可以看到,delay将默认为除以下值之外的任何其他值:

/** get sensor data as fast as possible */
    public static final int SENSOR_DELAY_FASTEST = 0;
    /** rate suitable for games */
    public static final int SENSOR_DELAY_GAME = 1;
    /** rate suitable for the user interface  */
    public static final int SENSOR_DELAY_UI = 2;
    /** rate (default) suitable for screen orientation changes */
    public static final int SENSOR_DELAY_NORMAL = 3;

所以只要你的值不是0,1,3,那么你就可以了,你的应该被使用。

 类似资料:
  • 问题内容: 这是用于通过布雷森纳姆算法在计算出的位置上绘制点的代码: 列表“布雷森汉姆”包含所有借助布雷森汉姆线描算法预先计算的点。我想在“ for”循环中设置1秒的延迟,以便在间隔1秒后绘制每个点。“延迟”部分中列出的部分无效。如何使“延迟”工作?更具体地说,我想看到所有的点以1秒的间隔在屏幕上一个接一个地绘制。 问题答案: 我假设您正在某个方法中调用此方法。 只是一个提示: 从来没有睡过油漆过

  • 在上选择用户定义变量作为别名时,以下查询(这是一个压缩形式)运行良好,但在上中断

  • 问题内容: 当我做 我看到两个查询被解雇了。一个用于获取人员数据,另一个用于人员详细数据。 根据我的理解,应该仅触发1个查询来获取人数据而不是人详细数据,因为我已经提到了延迟加载。为什么personDetail数据与person数据一起获取? 问题答案: Hibernate无法像代理关系中的Sets / Lists一样代理自己的对象,因此延迟加载不起作用。 我认为此链接可能有助于理解您的问题:ht

  • hibernate的@BatchSize注释允许批量获取延迟加载的实体。例如,如果我有类似的东西: 现在,如果我得到一个产品的类别,Hibernate将获取多达10个处于当前会话中且尚未初始化其类别字段的产品的类别。这节省了大量对数据库的SQL调用。到目前为止还不错。现在我想知道为什么我不会在每个延迟加载关系上使用@BatchSize注释?毕竟,我为什么要对数据库进行额外的调用?这显然是有原因的,

  • 我正在尝试为Xamarin.Forms创建一个自定义的ButtonRenderer。下面是一个简单的测试,我一直在尝试根据一些教程组合起来,但我似乎可以使它工作。

  • 请建议如何解决这个问题。我被困在这里了。 下面是错误信息; null