Android 传感器
说到传感器,相信大家都不会陌生吧,比如微信的摇一摇就用到了加速度传感器
传感器
一种物理设备或者生物器官,能够探测、感受外界的信号,物理条件(如光,热,适度)或化学组成 (如烟雾),并将探知的信息传递给其它的设备或者部件
传感器的种类
可以从不同的角度对传感器进行划分,转换原理
(传感器工作的基本物理或化学效应) 、用途 、输出信号以及制作材料和工艺 等
一般是按工作原来来分 物理传感器 与 化学传感器两类
手机上搭载的基本都是物理传感器
- 方向传感器 (Orientation sensor)
- 加速感应器(Accelerometer sensor)
- 陀螺仪传感器 (Gyroscope sensor)
- 磁场传感器 (Magnetic field sensor)
- 距离传感器 (Proximity sensor)
- 光线传感器 (Light sensor)
- 气压传感器 (Pressure sensor)
- 温度传感器 (Temperature sensor)
- 重力感应器 (Gravity sensor)
- 线性加速感应器 (Linear acceleration sensor)
- 旋转矢量传感器 (Rotation vector sensor)
- 相对湿度传感器 (Relative humidity sensor)
- 近场通信 (NFC) 传感,NFC 和其它不一样,具有读写功能
除了上面罗列出的这些,还有其它的传感器,比如心率传感器,记步传感器,指纹传感器等
如果想查看 Android
支持多少传感器,可以访问 Android Sensor
查看当前设备支持的传感器
从 Android Sensor 可以知道 Android 支持数量庞大的传感器,但并不是每种传感器手机上都有
每台手机上搭载的传感器类型以及数目都可能是不一样的,比如 Nexus 5 支持的传感器类型有
重力,光线,距离,气压和陀螺仪
而 moto x 二代则有
重力,光线,距离和红外传感器
我们现在写一个 demo 来列出自己设备支持的传感器
下面的手机是我们 锤子 红色版,可以看到传感器真多,40+ 个
-
创建一个 空的 Android 项目
cn.twle.android.ListSensor
-
修改 activity_main.xml 添加一个文本框用于显示所有的传感器
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:padding="16dp" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/ms_sensor" android:layout_width="match_parent" android:layout_height="match_parent" /> </ScrollView> </RelativeLayout>
-
修改 MainActivity.java
package cn.twle.android.listsensor; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView ms_sensor; private SensorManager sm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); ms_sensor = (TextView) findViewById(R.id.ms_sensor); List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL); StringBuilder sb = new StringBuilder(); sb.append("你手机上有以下 " + allSensors.size() + " 个传感器有:\n\n"); for(Sensor s:allSensors){ switch (s.getType()){ case Sensor.TYPE_ACCELEROMETER: sb.append(s.getType() + " 加速度传感器(Accelerometer sensor)" + "\n"); break; case Sensor.TYPE_GYROSCOPE: sb.append(s.getType() + " 陀螺仪传感器(Gyroscope sensor)" + "\n"); break; case Sensor.TYPE_LIGHT: sb.append(s.getType() + " 光线传感器(Light sensor)" + "\n"); break; case Sensor.TYPE_MAGNETIC_FIELD: sb.append(s.getType() + " 磁场传感器(Magnetic field sensor)" + "\n"); break; case Sensor.TYPE_ORIENTATION: sb.append(s.getType() + " 方向传感器(Orientation sensor)" + "\n"); break; case Sensor.TYPE_PRESSURE: sb.append(s.getType() + " 气压传感器(Pressure sensor)" + "\n"); break; case Sensor.TYPE_PROXIMITY: sb.append(s.getType() + " 距离传感器(Proximity sensor)" + "\n"); break; case Sensor.TYPE_TEMPERATURE: sb.append(s.getType() + " 温度传感器(Temperature sensor)" + "\n"); break; default: sb.append(s.getType() + " 其他传感器" + "\n"); break; } sb.append("设备名称:" + s.getName() + "\n设备版本:" + s.getVersion() + "\n供应商:" + s.getVendor() + "\n\n"); } ms_sensor.setText(sb.toString()); } }
传感器 (Sensor) 相关方法
从上面的 demo 中,我们可以总结出获取 Sensor 传感器以及获取传感器相关的一些信息流程如下
-
获得传感器管理器
SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
-
获得设备的传感器对象的列表
List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
-
迭代获取 Sensor 对象,然后调用对应方法获得传感器的相关信息
for(Sensor s:allSensors){ sensor.getName(); // 获得传感器名称 sensor.getType(); // 获得传感器种类 sensor.getVendor(); // 获得传感器供应商 sensor.getVersion(); // 获得传感器版本 sensor.getResolution(); // 获得精度值 sensor.getMaximumRange(); // 获得最大范围 sensor.getPower(); // 传感器使用时的耗电量 }