【Android】传感器初步学习心得

【Android】传感器初步学习心得

一、传感器基础

根据官方文档,Android传感器有三大类,分别是:

  • Motion sensors
  • Environmental sensors
  • Position sensors

如果从另一角度来划分的话,传感器又可以分为基于硬件的和基于软件的两大类。基于硬件的传感器一般是通过物理组件去实现的。一般通过测量特殊环境的属性来获取数据,如:重力加速度、地磁场强度或方位角度的变化。而基于软件的传感器并不依赖物理设备,尽管他们是模仿基于硬件的传感器的。基于软件的传感器通常是通过一个或更多的硬件传感器获取数据,并且有时会调用虚拟传感器或人工传感器等等,线性加速度传感器和重力传感器就是基于软件传感器的例子。

下面通过官方的一张图看看安卓平台支持的所有传感器类型:
image01
image02
image03

使用传感器的话那么首先需要了解的是传感器API。Android中传感器类是通过Sensor类表示的,它属于android.hardware包下的类,顾名思义,和硬件相关的类。传感器的API不复杂,包含3个类和一个接口,分别是:

  • SensorManager:可以通过这个类去创建一个传感器服务的实例,这个类提供的各种方法可以访问传感器列表、注册或解除注册传感器事件监听、获取方位信息等。
  • Sensor:用于创建一个特定的传感器实例,这个类提供的方法可以让你决定一个传感器的功能。
  • SensorEvent:系统会通过这个类创建一个传感器事件对象,提供了一个传感器的事件信息,包含一下内容,原生的传感器数据、触发传感器的事件类型、精确的数据以及事件发生的时间。
  • SensorEventListener:可以通过这个接口创建两个回调用法来接收传感器的事件通知,比如当传感器的值发生变化时。

不同传感器在不同Android版本中的可用性不同,一些传感器在高版本下已经被弃用。下面是传感器的可用性表格:

二、常见的传感器用法

首先,我们要了解传感器坐标系统这个概念:

在Android平台中,传感器框架通常是使用一个标准的三维坐标系去表示一个值的。以方向传感器为例,确定一个方向当然也需要一个三维坐标,毕竟我们的设备不可能永远水平端着吧,准确的说android给我们返回的方向值就是一个长度为3的float数组,包含三个方向的值。

下面看一下官方提供的传感器API使用的坐标系统示意图:

仔细看一下这张图,不难发现,z是指向地心的方位角,x轴是仰俯角(由静止状态开始前后反转),y轴是翻转角(由静止状态开始左右反转)。下面切入正题,看看如何通过方向传感器API去获取方向。结合上面的图再看看官方提供的方向传感器事件的返回值:

这与上面提到的相吻合了,是由一个长度为3的float数组去表示一个位置信息的。数组第一个元素表示z轴,第二个信息表示x轴,第三个信息表示y轴。

1.实例化SensorManager

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

2.获取设备支持的全部Sensor的List

List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);  

因此,可以通过下面的方法将手机所支持的传感器全部列出来:

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

MainActivity代码:

public class MainActivity extends AppCompatActivity {
    private SensorManager mSensorManager;
    private ListView sensorListView;
    private List<Sensor> sensorList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorListView = (ListView) findViewById(R.id.list_view);
        // 实例化传感器管理器
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // 得到支持的所有传感器的List
        sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
        List<String> sensorNameList = new ArrayList<String>();
        for (Sensor sensor : sensorList) {
            sensorNameList.add(sensor.getName());
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, sensorNameList);
        sensorListView.setAdapter(adapter);
    }
}

三、Orientation Sensor的使用

Android平台提供了两个传感器来让我们判断设备位置,分别是:地磁场传感器和方向传感器。其中,方向传感器是基于软件的,并且它的数据是通过加速度传感器和磁场传感器共同获得的。

具体算法已经封装好,我们不必去关心他们的实现。只用了解如何运用即可。

下面是方向传感器的具体运用:

布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/text_z"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text_x"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text_y"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

MainActivity代码:

public class MainActivity extends AppCompatActivity {
    private SensorManager mSensorManager;
    private Sensor mOrientation;
    private TextView textZ;
    private TextView textX;
    private TextView textY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textX = (TextView)findViewById(R.id.text_x);
        textY = (TextView)findViewById(R.id.text_y);
        textZ = (TextView)findViewById(R.id.text_z);

        //实例化SensorManager
        mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

        mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        //为SensorManager注册监听
        mSensorManager.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                float a = event.values[0];
                textZ.setText(a + "");
                float b = event.values[1];
                textX.setText(b + "");
                float c = event.values[2];
                textY.setText(c + "");
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int i) {

            }
        },mOrientation,SensorManager.SENSOR_DELAY_NORMAL);
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: