您的位置:首页 > 移动开发 > Android开发

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

2014-12-21 14:47 435 查看
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处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_GR***ITY, "TYPE_GR***ITY");

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开发相关文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐