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

               

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei

传感器架构

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,我们将查询设备支持哪些传感器,并获取这些传感器的信息。下图是运行结果:

代码片段如下:

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);
}

相关小例子代码:Pro Android学习:传感器小例子

相关链接:我的Android开发相关文章

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/skdhfdfc/article/details/87537222