安卓方向传感器Sensor.TYPE_ORIENTATION废弃之后获得方向信息

安卓方向传感器Sensor.TYPE_ORIENTATION已经在安卓中不推荐使用了,用getOrientation来代替,用这个却不像以前那样一下就可以拿到数据,需要同时使用地磁传感器和加速度传感器来获取,代码如下:

package com.catcher.testcompass;



import android.app.Activity;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.widget.TextView;



public class FourActivity extends Activity {

    private TextView tv;

    private SensorManager manager;

    private MySensorEventListener listener;

    private Sensor magneticSensor, accelerometerSensor;

    private float[] values, r, gravity, geomagnetic;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_four);

        tv = (TextView) findViewById(R.id.tv);

        //获取SensorManager

        manager = (SensorManager) getSystemService(SENSOR_SERVICE);

        listener = new MySensorEventListener();

        //获取Sensor

        magneticSensor = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        accelerometerSensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        //初始化数组

        values = new float[3];//用来保存最终的结果

        gravity = new float[3];//用来保存加速度传感器的值

        r = new float[9];//

        geomagnetic = new float[3];//用来保存地磁传感器的值

    }



    private class MySensorEventListener implements SensorEventListener {



        @Override

        public void onSensorChanged(SensorEvent event) {

            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

                geomagnetic = event.values;

            }

            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                gravity = event.values;

                getValue();

            }

        }



        @Override

        public void onAccuracyChanged(Sensor sensor, int accuracy) {

            

        }

    }



    @Override

    protected void onResume() {

        super.onResume();

        manager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);

        manager.registerListener(listener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);

    }



    @Override

    protected void onPause() {

        manager.unregisterListener(listener);

        super.onPause();

    }



    public void getValue() {

        // r从这里返回

        SensorManager.getRotationMatrix(r, null, gravity, geomagnetic);

        //values从这里返回

        SensorManager.getOrientation(r, values);

        //提取数据

        double azimuth = Math.toDegrees(values[0]);

        if (azimuth<0) {

            azimuth=azimuth+360;

        }

        double pitch = Math.toDegrees(values[1]);

        double roll = Math.toDegrees(values[2]);

        tv.invalidate();

        tv.setText("Azimuth:" + (int)azimuth + "\nPitch:" + (int)pitch + "\nRoll:" + (int)roll);

    }

}

布局文件只有一个TextView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="com.catcher.testcompass.MainActivity" >



    <TextView

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textSize="20sp"

        android:text="@string/hello_world" />



</RelativeLayout>

 

你可能感兴趣的:(ORIENTATION)