方向传感器

正常情况下我们会使用TYPE_ORIENTATION,但是,使用之后你会发现我们选要用的方向传感器TYPE_ORIENTATION已经过时了,后面再说用什么来替代它。

先看一下常用传感器的使用方法:

1.实例化 SensorManager

SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

2.获取Sensor对象

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

3.注册监听

sensorManager.registerListener(this, sensor, SENSOR_DELAY_UI);

4.创建一个自定义传感器事件监听接口,这里进行数据的提取,分析

class MySensorEventListener implements SensorEventListener {
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        float a = event.values[0];
        azimuthAngle.setText(a + "");
        float b = event.values[1];
        pitchAngle.setText(b + "");
        float c = event.values[2];
        rollAngle.setText(c + "");
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
 
    }
 
}

5.结束时取消注册

sensorManager.unregisterListener(this, sensor);


但是、、、注意这行

mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

官方已经不推荐使用了


最后,把它TYPE_ORIENTATION 替代了

替代之后是


package com.example.sensordemo;
 
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    private SensorManager mSensorManager;
 
    private Sensor accelerometer; // 加速度传感器
    private Sensor magnetic; // 地磁场传感器
 
    private TextView azimuthAngle;
 
    private float[] accelerometerValues = new float[3];
    private float[] magneticFieldValues = new float[3];
 
    private static final String TAG = "---MainActivity";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 实例化传感器管理者
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // 初始化加速度传感器
        accelerometer = mSensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        // 初始化地磁场传感器
        magnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
 
        azimuthAngle = (TextView) findViewById(R.id.azimuth_angle_value);
        calculateOrientation();
    }
 
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        // 注册监听
        mSensorManager.registerListener(new MySensorEventListener(),
                accelerometer, Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(new MySensorEventListener(), magnetic,
                Sensor.TYPE_MAGNETIC_FIELD);
        super.onResume();
    }
 
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        // 解除注册
        mSensorManager.unregisterListener(new MySensorEventListener());
        super.onPause();
    }
 
    // 计算方向
    private void calculateOrientation() {
        float[] values = new float[3];
        float[] R = new float[9];
        SensorManager.getRotationMatrix(R, null, accelerometerValues,
                magneticFieldValues);
        SensorManager.getOrientation(R, values);
        values[0] = (float) Math.toDegrees(values[0]);
 
        Log.i(TAG, values[0] + "");
        if (values[0] >= -5 && values[0] < 5) {
            azimuthAngle.setText("正北");
        } else if (values[0] >= 5 && values[0] < 85) {
            // Log.i(TAG, "东北");
            azimuthAngle.setText("东北");
        } else if (values[0] >= 85 && values[0] <= 95) {
            // Log.i(TAG, "正东");
            azimuthAngle.setText("正东");
        } else if (values[0] >= 95 && values[0] < 175) {
            // Log.i(TAG, "东南");
            azimuthAngle.setText("东南");
        } else if ((values[0] >= 175 && values[0] <= 180)
                || (values[0]) >= -180 && values[0] < -175) {
            // Log.i(TAG, "正南");
            azimuthAngle.setText("正南");
        } else if (values[0] >= -175 && values[0] < -95) {
            // Log.i(TAG, "西南");
            azimuthAngle.setText("西南");
        } else if (values[0] >= -95 && values[0] < -85) {
            // Log.i(TAG, "正西");
            azimuthAngle.setText("正西");
        } else if (values[0] >= -85 && values[0] < -5) {
            // Log.i(TAG, "西北");
            azimuthAngle.setText("西北");
        }
    }
 
    class MySensorEventListener implements SensorEventListener {
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerometerValues = event.values;
            }
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                magneticFieldValues = event.values;
            }
            calculateOrientation();
        }
 
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
 
        }
 
    }
 
}


到这里就可以了!


猜你喜欢

转载自blog.csdn.net/android157/article/details/77371882