zoukankan      html  css  js  c++  java
  • 关于android方向传感器的使用

    Android2.2以后 orientation sensors 就被deprecated了

    官方建议用acceleration and magnetic sensor 来算

    关于这个问题,CSDN上一篇博文讲的非常好

    http://blog.csdn.net/flowingflying/article/details/43233315

    stack overflow上:

    http://stackoverflow.com/questions/10291322/what-is-the-alternative-to-android-orientation-sensor

    用法的话直接看代码

    package com.turtle920.androidaudioprocess;
    
    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.util.Log;
    import android.view.Menu;
    import android.widget.TextView;
    
    //实现传感器事件监听:SensorEventListener
    public class MainActivity extends Activity implements SensorEventListener{
    
        private SensorManager sensorManager;
        private Sensor acc_sensor;
        private Sensor mag_sensor;
        //加速度传感器数据
        float accValues[]=new float[3];
        //地磁传感器数据
        float magValues[]=new float[3];
        //旋转矩阵,用来保存磁场和加速度的数据
        float r[]=new float[9];
        //模拟方向传感器的数据(原始数据为弧度)
        float values[]=new float[3];
        int counter=0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
            //给传感器注册监听:
            sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_NORMAL);
            sensorManager.registerListener(this, mag_sensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        //传感器状态改变时的回调方法
        @Override
        public void onSensorChanged(SensorEvent event) {
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
                accValues=event.values;
            }
            else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
                magValues=event.values;
            }
            /**public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
             * 填充旋转数组r
             * r:要填充的旋转数组
             * I:将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
             * gravity:加速度传感器数据
             * geomagnetic:地磁传感器数据
             */
            SensorManager.getRotationMatrix(r, null, accValues, magValues);
            /**
             * public static float[] getOrientation (float[] R, float[] values)
             * R:旋转数组
             * values :模拟方向传感器的数据
             */
    
            SensorManager.getOrientation(r, values);
    
            if (counter++ % 10==1){
                Log.e("DEBUG", "x:"+Math.toDegrees(values[0])+" y:"+Math.toDegrees(values[1])+" z:"+Math.toDegrees(values[2]));
            }
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    
    }

    输出的x,y,z三个值是手机沿这个轴的旋转角度

    这个地方有个要注意的问题是Macbook的屏幕开合的磁铁磁力会影响磁力传感器。。。调试的时候要注意

  • 相关阅读:
    《常微分方程,王高雄》 习题 1.5,1.8(2)
    微分方程及边值问题:计算与建模 习题1.17-1.31
    打造自己备份的系统镜像
    打造自己备份的系统镜像
    ★一名“标题党”自我修炼的10大技巧
    ★一名“标题党”自我修炼的10大技巧
    ★数学上最大的数是多少?
    ★不容错过的PPT教程!
    ★不容错过的PPT教程!
    【★】电子产品降价的3大原因!
  • 原文地址:https://www.cnblogs.com/turtle920/p/4949254.html
Copyright © 2011-2022 走看看