orientation - R如何为所有传感器注册SensorEventListener

标签 orientation accelerometer sensors

当我研究有关传感器的内容时​​,我发现当我使用 sensorlistener (在我的代码中为 mysensorlistener)注册设备中的所有传感器时,它可以得到我需要的东西。如果我将监听器更改为 sensoreventlistener(在我的代码中为 mysensoreventlistener),它只能获取加速度计数据。

我想知道是否可以获取所有数据,只需注册一个sensorevevtlistener即可。

代码如下:

package com.example.testaccelerometer;


import com.example.testaccelerometer.R;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class AccelerometerReader extends Activity {


    TextView atvx;
    TextView atvy;
    TextView atvz;
    TextView otvx;
    TextView otvy;
    TextView otvz;
    SensorManager mySensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.disp);
        atvx = (TextView)findViewById(R.id.atvx);
        atvy = (TextView)findViewById(R.id.atvy);
        atvz = (TextView)findViewById(R.id.atvz);
        otvx = (TextView)findViewById(R.id.otvx);
        otvy = (TextView)findViewById(R.id.otvy);
        otvz = (TextView)findViewById(R.id.otvz);
        mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        mySensorManager.unregisterListener(mySensorEventListener);
        //mySensorManager.unregisterListener(aSensorEventListener);
        //mySensorManager.unregisterListener(oSensorEventListener);
        super.onPause();
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        //mySensorManger.registerListener(mySensorListener, SensorManager.SENSOR_ALL,SensorManager.SENSOR_DELAY_FASTEST);
        mySensorManager.registerListener(mySensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ALL), SensorManager.SENSOR_DELAY_GAME);
        //mySensorManager.registerListener(aSensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
        //mySensorManager.registerListener(oSensorEventListener, mySensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);
        super.onResume();
    }
    /*private SensorListener mySensorListener = new SensorListener(){

        public void onAccuracyChanged(int sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        public void onSensorChanged(int sensor, float[] values) {
            // TODO Auto-generated method stub
            switch(sensor){
            case SensorManager.SENSOR_ACCELEROMETER:
                atvx.setText("X轴方向的加速度:" + values[0]);
                atvy.setText("Y轴方向的加速度:" + values[1]);
                atvz.setText("Z轴方向的加速度:" + values[2]);
                break;
            case SensorManager.SENSOR_ORIENTATION:
                otvx.setText("X轴方向的角速度:" + values[0]);
                otvy.setText("Y轴方向的角速度:" + values[1]);
                otvz.setText("Z轴方向的角速度:" + values[2]);
            }
        }


    };*/
    private SensorEventListener mySensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            float[] values2;
            switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                values1 = event.values;
                atvx.setText("X轴方向的加速度:" + values1[0]);
                atvy.setText("Y轴方向的加速度:" + values1[1]);
                atvz.setText("Z轴方向的加速度:" + values1[2]);
                System.out.println("run....accele");
                break;
            case Sensor.TYPE_ORIENTATION:
                values2 = event.values;
                otvx.setText("X轴方向的角速度:" + values2[0]);
                otvy.setText("Y轴方向的角速度:" + values2[1]);
                otvz.setText("Z轴方向的角速度:" + values2[2]);
                System.out.println("run....orien");
                break;
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };
    /*
     * test
     */
    /*private SensorEventListener aSensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
                values1 = event.values;
                atvx.setText("X轴方向的加速度:" + values1[0]);          //accelerometer
                atvy.setText("Y轴方向的加速度:" + values1[1]);
                atvz.setText("Z轴方向的加速度:" + values1[2]);
                System.out.println("run....accele");
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };*/
        /*private SensorEventListener oSensorEventListener = new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float[] values1;
            if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
                values1 = event.values;
                otvx.setText("X轴方向的角速度:" + values1[0]);         //orientation
                otvy.setText("Y轴方向的角速度:" + values1[1]);
                otvz.setText("Z轴方向的角速度:" + values1[2]);
                System.out.println("run....orien");
            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };*/
}

当我上网时,有人说SensorEventListener不能使用TYPE_ALL来注册所有传感器,但它可以使用它来获取传感器列表。 就像这里的代码:

//  注册加速度传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册磁场传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册光线传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_FASTEST);

        //  注册方向传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_FASTEST);

最佳答案

如果您只需要将所有传感器注册到同一个监听器,我会尝试以下操作:

List<Sensor> sensors = mySensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER  );
for(int i = 0; i < sensors.lenght(); i++) {
  mySensorManager.registerListener(mySensorListener, sensors[i], SensorManager.SENSOR_DELAY_FASTEST);
}

然后在阅读信息时使用如下开关:

this.mySensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    int type = sensor.getType();
    switch (type) {
    case Sensor.TYPE_ACCELEROMETER:
            doSomethingInteresting();
        break;
    case Sensor.TYPE_LINEAR_ACCELERATION:
                doSomethingInteresting();
        break;
    case ....:
                ......
                ......
            default:
        break;
         }
}
};

该代码并不完美,因此请不要将其剪切并粘贴到您的代码中,因为我认为它无法编译。

关于orientation - R如何为所有传感器注册SensorEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908176/

相关文章:

java - 我应该使用加速度计还是陀螺仪来测量 z 轴的角度

java - OnSensorChanged() 不改变循环中的值

css - 尝试在仅使用 CSS 的设备上强制使用横向模式

iPhone 纵向导航栏高度仍然较短

c++ - 使用索贝尔的奇怪方向图。怎么了?

c++ - 方向传感器的 Windows Sensor API C++ COM 集成未在 Windows 10 上定期更新

java - 为什么我的加速度传感器在关闭 Activity 后仍在工作?

android - 如何处理 HTML5 Web 应用程序中的旋转?

embedded - 从 IMU 加速度计中去除重力

java - Android 加速度计读数