有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在请求时仅读取一次Android传感器数据

我试图读取Java 安卓应用程序中的加速度计和/或地磁传感器,以确定设备在某一点的方向。但是传感器本身并不重要,我的问题可以应用到你想读的任何类型的传感器上,无论是运动、温度、光线、压力等等

我在everywhere看到的代码可以设置来自传感器的“数据流”,具有事件侦听器和对传感器通过回调发送给您的数据“作出反应”的能力

这不是我想要的,我想可能不可能做我想做的事

我们需要的是读取传感器数据一次。 不是两次,不是连续3秒,不是传感器向我发送事件时。 打开它,阅读它,关闭它

当我要求阅读时,我只需要一本书。 当我得到那个读数时,我不需要更多的读数

一旦你有了足够的权限,比如anysensor.getCurrentState(),感觉应该是一个简单的单行操作。 但从我所能阅读的内容来看,我只发现文档依赖于sensorManager中的事件侦听器,并且必须设置整个类和5个不同的事件回调:

https://developer.安卓.com/guide/topics/sensors/sensors_position#sensors-pos-orient

我猜我可以做到,并且尽量使它变得轻,让eventListeners在第一次阅读时自动停止。但它感觉非常整洁,而且有很多代码满足我的需要。我还试图做一个非常简单的任务,阅读一些关于它的东西,并完成它,这需要一些异步的东西。 所以我想我必须“暂停”应用程序,直到我得到第一个结果

这真的是最简单/唯一的方法吗


共 (2) 个答案

  1. # 1 楼答案

    从这里可以看到,如果不设置eventListeners,就不可能读取传感器数据

    Android get sensor data without EventListeners

    我现在还没有结束这个问题,以防有人能证实这是事实或其他

    如果有人想在同步函数中间集成这个异步步骤的最佳方法,那将是受欢迎的!

  2. # 2 楼答案

    我正在为我的问题写一个最终答案,因为我找到了一个适合我的特定用例的解决方案

    尽管我的操作不应该是“异步”的,但我最终做的是拆分脚本,以便“job.done();”继续我的脚本的其余部分,使“编码”大部分类似于同步脚本

    为了与大家分享,我把大部分东西都去掉了,尽量只保留有趣的部分。我希望这对任何试图做类似事情的人来说都足够了。这也是我找到的访问加速计数据的最短方法

    基本上,我的想法是我有一个switch,根据结果,我可能需要传感器,也可能不需要传感器(仅保留两个案例来说明我的观点)。 当case"portrait"时,我可以保持所有内容同步,并调用“job.done();”这将继续脚本的其余部分

    但是,如果case"auto_landscape",我想使用传感器。由于我只需要一次读取,当传感器发送其第一次回调(onSensorChanged())时,它将注销自身,然后使用相同的job.done();方法完成脚本

    这是:

    sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
    
    switch(currentMode) {
        case "portrait":
            setRotation(0);
            job.done("Portrait");
            break;
    
        case "auto_landscape":
            sensorListener = new SensorEventListener() {
                @Override public void onAccuracyChanged(Sensor arg0, int arg1) {}
                @Override public synchronized void onSensorChanged(SensorEvent event) {
                    if (event.values[0] > 0 ) {
                        // landscape right
                        setRotation(1);
                    } else {
                        // landscape left
                        setRotation(3);
                    }
                    sensorManager.unregisterListener(sensorListener);
                    job.done("Landscape (auto)");
                }
            };
            sensorManager.registerListener(sensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST );
            break;
        default:
            job.done("Something is wrong!");
    }