传感器概述

        现在市面上的Android手机和平板电脑(TV除外)都内置了传感器,否则很多游戏和应用就无法使用了。然而Android SDK支持的传感器并不是每一部Android设备都支持的传感器,大多数安卓设备只支持一部分传感器。

常见的安卓传感器种类

动作 ( Motion ) 传感器 Motion

这类传感器在三个轴(x,y,z)上测试加速度和旋转角度。

     包括如下几个传感器:

             加速(Accelerometer)传感器

             重力(gravity)传感器 如屏幕旋转

             陀螺仪(gyroscope)传感器

             旋转向量(rotational vector )传感器

环境 (Environmental) 传感器

这类传感器可以测量不同环境的参数,例如:周围环境的空气温度和压强、光照强度和湿度。

     包括如下几个传感器:

             湿度(barometer)传感器

             光线(photometer)传感器

             温度(thermometer)传感器

位置( Position) 传感器

这类传感器可以测量设备的物理位置。

     包括如下几个传感器:

     方向(orientation)传感器 如:电子罗盘

     磁力( manaetometer) 传感器

安卓传感器框架ASF

    Android SDK提供了ASF(Android sensor framework)可以用来访问当前Android设备内置的传感器。ASF提供了很多类和接口,可以帮助我们完成各种传感器有关的任务。
例如:

1.确定当前Android设备内置了哪些传感器

2.确定某一个传感器的技术指标。例如,该传感器能测量的最大范围,传感器的制造商,对电量的要求,测量的精度等。

3.获取传感器传回来的数据,以及定义传感器回传数据的精度。

4.注册和注销传感器事件的监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。

所有的常量都在Sensor类中定义

1.TYPE_ACCELEROMETER:加速传感器(硬件传感器)

2.TYPE_AMBIENT_TEMPERATURE:温度传感器(硬件传感器)

3.TYPE_GRAVITY:重力传感器(硬件或软件传感器)

4.TYPE_GYROSCOPE:陀螺仪传感器(硬件传感器)

5.TYPE_LIGHT:光线传感器(硬件传感器)

6.TYPE_LINEAR_ACCELERATION:线性加速传感器(硬件或软件传感器)

7.TYPE_MAGNETIC_FIELD:磁场传感器(硬件传感器)

8.TYPE_ORIENTATION:方向传感器(软件传感器),数据来自重力和磁场传感器

9.TYPE_PRESSURE:压力传感器(硬件传感器)

10.TYPE_PROXIMITY:临近传感器(硬件传感器)

11.TYPE_RELATIVE_HUMIDITY:湿度传感器(硬件传感器)

12.TYPE_ROTATION_VECTOR:旋转向量传感器(硬件或软件传感器)

13.TYPE_TEMPERATURE:温度传感器(硬件传感器),从Android4.0(API Level = 14)开始被TYPE_AMBIENT_TEMPERATURE取代。

ASF中的主要类和接口

SensorManager类:用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
Sensor类:提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。
SensorEvent类:系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括
的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
SensorEventListener接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调
方法。

获取当前Android设备支持的传感器

1.新建安卓工程“GetAllSensors”
2.修改布局文activity_main.xml如下:

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.xingyun.getallsensors.MainActivity" >

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

</RelativeLayout>

3.修改后台代码
MainActivity.java

package com.xingyun.getallsensors;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView showAllSensorsTextView;
    private SensorManager sensorManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载布局文件
        setContentView(R.layout.activity_main);

        //查找控件ID
        showAllSensorsTextView = (TextView) findViewById(R.id.showAllSensors);

        //获取安卓系统传感器服务
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        //获取当前Android设备支持的所有传感器
        List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

        //遍历传感器集合
        for (Sensor sensor:sensors) {
            //获取每一个传感器名称并追加到TextView上。
            showAllSensorsTextView.append(sensor.getName()+"\n");
        }

    }

}

4.运行截图如下:

Android 哪些传感器需要手动申请权限_sdk


解惑:

什么是Goldfish?

    Goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。Android模拟器通过运行它来运行arm926t指令集(arm926t属于armv5构架,goldfish处理器有ARMv5和ARMv7两个版本,在一般情况下,使用ARMv5的版本即可

更多解释参考:“安卓之GoldFish”

从上图可以看出该模拟器支持哪些传感器类型?

Goldfish 3axis Accelerometer 加速传感器(硬件传感器)

Goldfish 3axis Magnetic_field sensor:磁场传感器(硬件传感器)

Goldfish Orientation:方向传感器(软件传感器),数据来自重力和磁场传感器

Goldfish Temerature sensor:温度传感器(硬件传感器)

Goldfish proximity sensor:临近传感器(硬件传感器)

什么是硬件传感器?什么是软件传感器?

    ASF允许我们访问很多传感器类型,这些传感器有一些是基于硬件的传感器,还有一些是基于软件的传感器。

    基于硬件的传感器就是直接以芯片形式嵌入到Android设备中,这些传感器直接从外部环境获取数据,例如,加速传感器、磁场传感器都属于硬件传感器。

    基于软件的传感器并不是实际的硬件芯片,尽管这些传感器重使用上很像基于硬件的传感器。基于软件的传感器传回的数据本质上也来自于基于硬件的传感器,只是这些数据通常会经过二次加工,也就是说,基于软件的传感器传回的数据可能来自一个或多个基于硬件的传感器,并且有可能Android系统使用某些算法处理了这些数据。

    所以基于软件的传感器也可以称为虚拟(virtual)传感器或合成(synthetic)传感器