Android学习笔记(一五一):传感器(1):传感器列表

传感器架构

Android提供sensor framework也帮助开发者利用设备的传感器进行开发。传感器是只读的(NFC例外),因此只要设定监听器接受传感器信息即可。这和之前学习的GPS很相似,但GPS不属于传感器架构。下面列举部分传感器,实际上我们可以查Sensor.TYPE_XXXX获知当前支持的传感器类型,例如在Android API 18,还支持计步传感器,可支持传感器类型会越来越多。

  • 光传感器(Light sensor)
  • 接近感应器(Proximity sensor)
  • 温度传感器(Temperature sensor)
  • 压力传感器(Pressure sensor)
  • 陀螺仪传感器(Gyroscope sensor)
  • 加速感应器(Accelerometer)
  • 磁场感应器(Magnetic field sensor)
  • 方向感应器(Orientation sensor)
  • 重力感应器(Gravity sensor,Android 2.3引入)
  • 线性加速感应器(Linear acceleration sensor ,Android 2.3引入)
  • 旋转矢量传感器(Rotation vector sensor,Android 2.3)
  • 相对湿度传感器(Relative humidity sensor,Android 4.0)
  • 近场通信(NFC)传感器(Android 2.3引入),NFC和其他不一样,具有读写功能。

没碰到具有上述全部传感器的手机,模拟器只支持加速感应器,因此我们需要检查手机具有哪些传感器。通过代码,我们可以向SensorManager获得传感器list,但这要求先安装应用。如果某个传感器是必须的,我们希望如果手机不具备,就不要安装。例如某个应该必须具有接近感应器,我们可以在AndroidManifest.xml中进行声明,Android的官方应用商店Google Play将至只安装在具有加速感应器的手机上,但其他应用商就不保证具备该功能。

<uses-feature android:name="android.hardware.sensor.proximity" />

获取设备的传感器列表

小例子很简单,layout里面有一个ScrollView,里面是一个TextView,我们将查询设备支持哪些传感器,并获取这些传感器的信息。下图是运行结果:

Android学习笔记(一五一):传感器(1):传感器列表_第1张图片

代码片段如下:

private HashMap<Integer, String> sensorTypes = new HashMap<Integer,String>(); 
{  //下面是根据Android4.4的reference列出的其所支持的Sensor类型,我们可以看看API 19支持哪些传感器。
    sensorTypes.put(Sensor.TYPE_ACCELEROMETER, "TYPE_ACCELEROMETER"); 
    sensorTypes.put(Sensor.TYPE_AMBIENT_TEMPERATURE, "TYPE_AMBIENT_TEMPERATURE");
    sensorTypes.put(Sensor.TYPE_GAME_ROTATION_VECTOR, "TYPE_GAME_ROTATION_VECTOR");
    sensorTypes.put(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, "TYPE_GEOMAGNETIC_ROTATION_VECTOR");
    sensorTypes.put(Sensor.TYPE_GRAVITY, "TYPE_GRAVITY"); 
    sensorTypes.put(Sensor.TYPE_GYROSCOPE, "TYPE_GYROSCOPE"); 
    sensorTypes.put(Sensor.TYPE_GYROSCOPE_UNCALIBRATED,"TYPE_GYROSCOPE_UNCALIBRATED");
    sensorTypes.put(Sensor.TYPE_LIGHT, "TYPE_LIGHT"); 
    sensorTypes.put(Sensor.TYPE_LINEAR_ACCELERATION, "TYPE_LINEAR_ACCELERATION");
    sensorTypes.put(Sensor.TYPE_MAGNETIC_FIELD, "TYPE_MAGNETIC_FIELD"); 
    sensorTypes.put(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, "TYPE_MAGNETIC_FIELD_UNCALIBRATED");
    sensorTypes.put(Sensor.TYPE_ORIENTATION,"TYPE_ORIENTATION (deprecated)");//use SensorManager.getOrientation() instead.
    sensorTypes.put(Sensor.TYPE_PRESSURE, "TYPE_PRESSURE"); 
    sensorTypes.put(Sensor.TYPE_PROXIMITY, "TYPE_PROXIMITY"); 
    sensorTypes.put(Sensor.TYPE_RELATIVE_HUMIDITY, "TYPE_RELATIVE_HUMIDITY"); 
    sensorTypes.put(Sensor.TYPE_ROTATION_VECTOR, "TYPE_ROTATION_VECTOR"); 
    sensorTypes.put(Sensor.TYPE_SIGNIFICANT_MOTION,"TYPE_SIGNIFICANT_MOTION"); 
    sensorTypes.put(Sensor.TYPE_STEP_COUNTER,"TYPE_STEP_COUNTER"); 
    sensorTypes.put(Sensor.TYPE_STEP_DETECTOR,"TYPE_STEP_DETECTOR"); 
    sensorTypes.put(Sensor.TYPE_TEMPERATURE, "TYPE_TEMPERATURE(deprecated)");//使用Sensor.TYPE_AMBIENT_TEMPERATURE


private void showSensorList(){ 
    showInfo("设备具有下列传感器:"); 
    //【1】获得传感器管理器 
    SensorManager sensorMgr = (SensorManager)getSystemService(SENSOR_SERVICE); 
    //【2】获得设备的传感器对象的列表 
    List<Sensor> list = sensorMgr.getSensorList(Sensor.TYPE_ALL);

    //【2.1】显示传感器对象的信息。同样的传感器类型,不同厂家不同型号会有所不同,例如解析度不同,数值范围不同,功耗对应用性能重要,但是老实说这更多是OEM应该关心的问题,因为器件是他们选择的。当然如果发现功耗过大,需要尽量避免长时间使用。
    for(Sensor sensor : list){ 
        showInfo("名字:" + sensor.getName()); 
        showInfo("  type:" + sensorTypes.get(sensor.getType()) + "(" + sensor.getType() +")");
        showInfo("  vendor:" + sensor.getVendor()); 
        showInfo("  version:" + sensor.getVersion()); 
        showInfo("  resolution:" + sensor.getResolution()); 
        showInfo("  max range:" + sensor.getMaximumRange()); 
        showInfo("  power:" + sensor.getPower()); 
    } 


private void showInfo(String info){ 
    tv.append("\n" + info); 
    Log.d("SensorList",info); 
}
 

你可能感兴趣的:(Android学习笔记(一五一):传感器(1):传感器列表)