传感器~使用起来很简单。不过有人提醒我我的博客还是要讲点原理,所以还是先撸一发原理:

关键点:传感器按组成方式分为硬件传感器和软件传感器,根据功能可以分为动作传感器,位置传感器,方向传感器,磁场传感器,临近传感器,环境传感器,光线传感器以及未来许许多多的传感器。(虽然看这么多不知道有什么用,不过别人问起来的时候能说点原理感觉还是挺厉害的~)

简介:

传感器是第二代智能手机的重要标志之一。可以毫不客气地说,现在市面上的Android手机和平板电脑(TV除外)都内置了传感器。否则很多游戏和应用就无法使用了。Android SDK支持的传感器并不是每一部Android设备都支持所有的传感器。大多数Android设备只支持一部分传感器。例如,方向传感器(电子罗盘)、重力传感器(屏幕翻转、赛车游戏等)。

目前使用的比较多的传感器:

加速度传感器(accelerometer)、陀螺仪(gyroscope)、环境光照传感器(light)、磁力传感器(magnetic field)、方向传感器(orientation)、压力传感器(pressure)、距离传感器(proximity)和温度传感器(temperature)

一、传感器的获取

1、Android所有的传感器都归传感器管理器 SensorManager 管理,获取传感器管理器的方法:

String name = Context.SENSOR_SERVICE; 
       SensorManager sensorManager = (SensorManager)getSystemService(name);

2、现行Android版本支持的传感器有:

android传感器权限 安卓传感器_Android

3、通过传感器管理器获取传感器对象的方法:

(1)、获取一个传感器       
 Sensor defaultGyroscope = 
   sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 
(2)、获取多个传感器,获取结果是传感器集合       
   List<Sensor> pressureSensors = 
sensorManager.getSensorList(Sensor.TYPE_PRESSURE); 
//限定某种传感器类型 或者不限传感器类型获取传感器对象列表: 
       List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

4、传感器对象=的方法:

android传感器权限 安卓传感器_android_02

二、传感器事件的常规应用步骤

1、获取传感器管理器对象、传感器对象

// 获取传感器管理器
 SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
// 获取加速传感器
Sensor acceleromererSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

2、定义传感器事件

// 定义传感器事件监听器
 SensorEventListener acceleromererListener = new SensorEventListener() { 

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

} 

//传感器数据变动事件
@Override 
 public void onSensorChanged(SensorEvent event) { 

float x = event.values[SensorManager.DATA_X]; 

float y = event.values[SensorManager.DATA_Y]; 

float z = event.values[SensorManager.DATA_Z]; 

//x、y、z变量是从加速传感器获得的数据 
} 
};

3、注册(应用)传感器事件

//在传感器管理器中注册监听器
sm.registerListener(acceleromererListener, 
acceleromererSensor, SensorManager.SENSOR_DELAY_NORMAL);

三、传感器事件参数变量

onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float[]。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。

1、方向传感器
values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。
values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]≤180。
values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。

2、加速传感器
该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。
X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。
Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。 Z轴的方向是从手机里指向天空。
3、重力传感器
重力传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。
4、光线传感器
光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。
5、陀螺仪传感器
陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:
values[0]:延X轴旋转的角速度。 values[1]:延Y轴旋转的角速度。 values[2]:延Z轴旋转的角速度。
当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。

Demo:

下面一个小例子:查看手机含有多少种传感器:

布局文件很简单,就一个TextView:

activity_main:

<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.chan.sensor.MainActivity">

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

MainActivity:

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private SensorManager sensorManager;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        tv = (TextView) findViewById (R.id.tv);
        getAllSensor ();
    }

    // 获取设备支持的所有传感器
    private void getAllSensor () {
        sensorManager = (SensorManager) getSystemService (SENSOR_SERVICE);
        List<Sensor> sensorList = sensorManager.getSensorList (Sensor.TYPE_ALL);

        for (Sensor sensor : sensorList) {
            String name = sensor.getName ();
            int version = sensor.getVersion ();
            String vendor = sensor.getVendor ();
            String type = null;


            switch (sensor.getType ()) {
                case Sensor.TYPE_ACCELEROMETER:
                    type = "加速度传感器";
                    break;
                case Sensor.TYPE_AMBIENT_TEMPERATURE:
                    type = "温度传感器";
                    break;
                case Sensor.TYPE_GRAVITY:
                    type = "重力传感器";
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    type = "陀螺仪传感器";
                    break;
                case Sensor.TYPE_LIGHT:
                    type = "光线传感器";
                    break;
                case Sensor.TYPE_LINEAR_ACCELERATION:
                    type = "线性加速度传感器";
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    type = "磁场传感器";
                    break;
                default:
                    break;
            }

            String msg = name + "-" + type + "-" + version + "-" + vendor + "\n";
            Log.d ("tag", msg);
            tv.append (msg );
        }

        tv.append ("共" + sensorList.size () + "种传感器");
    }
}

效果如下:

android传感器权限 安卓传感器_传感器_03

下一篇:

利用传感器实现一些实例。