安卓方向传感器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>
时间: 2024-10-25 21:49:49