转- android硬件传感器
纯属转载:http://dev.10086.cn/cmdn/bbs/thread-41843-1-1.html
1、传感器入门
自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero以及其他的Android手机,会发现通过将手机横向或纵向放置,屏幕会随着手机位置的不同而改变方向。这种功能就需要通过重力传感器来实现,除了重力传感器,还有很多其他类型的传感器被应用到手机中,例如磁阻传感器就是最重要的一种传感器。虽然手机可以通过GPS来判断方向,但在GPS信号不好或根本没有GPS信号的情况下,GPS就形同虚设。这时通过磁阻传感器就可以很容易判断方向(东、南、西、北)。有了磁阻传感器,也使罗盘(俗称指向针)的电子化成为可能。
在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。SensorEventListener接口的代码如下:

- .0f;
- .70f;
- .87f;
- .80665f;
- .6f;
- .71f;
- .12f;
- .96f;
- .69f;
- .0f;
- .6f;
- .000000353036145f;
- .815162342f;
1.4 光线传感器
光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:

- .0f;
- .0f;
- .0f;
- .0f;
- .0f;
- .0f;
- .25f;
- .001f;
上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。
1.5陀螺仪传感器
陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。
values[1]:延Y轴旋转的角速度。
values[2]:延Z轴旋转的角速度。
当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:private static final float NS2S = 1.0f / 1000000000.0f;

- )
- {
- // event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)
- ] += event.values[] * dT;
- angle[] += event.values[] * dT;
- angle[] += event.values[] * dT;
- }
- timestamp = event.timestamp;
- }
上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。
1.6其他传感器
其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。
近程传感器(Sensor.TYPE_PROXIMITY)
线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION)
旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR)
磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)
压力传感器(Sensor.TYPE_PRESSURE)
温度传感器(Sensor.TYPE_TEMPERATURE)
虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,Google Nexus S支持其中的9种传感器(不支持压力和温度传感器),而HTC G7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。
2. 测试手机中有哪些传感器(作者:银河使者)
我们可以通过如下三步使用传感器。
(1)编写一个截获传感器事件的类。该类必须实现android.hardware.SensorEventListener接口。
(2)获得传感器管理对象(SensorManager对象)。
(3)使用SensorManager.registerListener方法注册指定的传感器。
通过上面三步已经搭建了传感器应用程序的框架。而具体的工作需要在SensorEventListener接口的onSensorChanged和onAccuracyChanged方法中完成。SensorEventListener接口的定义如下:packageandroid.hardware;

- ] + "\n"
- + "Y:" + event.values[] + "\n" + "Z:" + event.values[] + "\n";
- tvAccelerometer.setText(accelerometer);
- ]);
- ] + "\n" + "Y:"
- + event.values[] + "\n" + "Z:" + event.values[] + "\n";
- tvMagentic.setText(magentic);
- ] + "\n"
- + "Y:" + event.values[] + "\n" + "Z:" + event.values[] + "\n";
- tvOrientation.setText(orientation);
- ];
- // 以指南针图像中心为轴逆时针旋转degree度
- RotateAnimation ra = .5f,
- Animation.RELATIVE_TO_SELF, .5f);
- // 在200毫秒之内完成旋转动作
- ra.setDuration();
- // 开始旋转图像
- imageView.startAnimation(ra);
- // 保存旋转后的度数,currentDegree是一个在类中定义的float类型变量
- currentDegree = -degree;
- }
- }
上面的代码中使用了event.values数组中的数据来获得传感器传回的数据。这个values数组非常重要,它的长度为3。但不一定每一个数组元素都有意义。对于不同的传感器,每个数组元素的含义不同。在下面的部分将详细介绍不同传感器中values数组各个元素的含义。
注意:虽然使用Sensor.TYPE_ALL可以获得手机支持的所有传感器信息,但不能使用Sensor.TYPE_ALL注册所有的传感器,也就是getDefaultSensor方法的参数值必须是某个传感器的类型常量,而不能是Sensor.TYPE_ALL。
3.2 计步器
还可以利用方向传感器做出更有趣的应用,例如利用values[1]或values[2]的变化实现一个计步器。由于人在走路时会上下振动,因此,可以通过判断values[1]或values[2]中值的振荡变化进行计步。基本原理是在onSensorChanged方法中计算两次获得values[1]值的差,并根据差值在一定范围之外开始计数,代码如下:

- ];
- flag = ] - lastPoint) > )
- {
- // 保存最后一步时的values[1]的峰值
- lastPoint = event.values[];
- // 将当前计数显示在TextView组件中
- textView.setText(String.valueOf(++count));
- }
- }
本例设置3个按钮用于控制计步的状态,这3个按钮可以控制开始计步、重值(将计步数清0)和停止计步。这3个按钮的单击事件代码如下

- ;
- msg = "已经重置计步器.";
- ;
- msg = "已经停止计步器.";
- );
- requireData(); //向Service 请求今日走过步数
- }
- //重写onDestroy 方法
- ; //记录今天走的步数
- ; //屏幕最上面留出的空隙
- ; //每一条的间距
- ; //每一条的高度
- .0f; //每天最大的步数
- ; //最大步数在屏幕中宽度
- Bitmap [] sprite; //运动小人的图片数组
- Bitmap [] digit; //数字图片数组
- Bitmap back_cell; //颜色渐变条
- ];
- digit = ];
- //初始化图片
- Resources res = getResources();
- sprite[] = BitmapFactory
- .decodeResource(res, R.drawable.act_1);
- …//省略部分Bitmap 的创建代码
- back_cell = BitmapFactory
- .decodeResource(res, R.drawable.back_cell);
- //获取数据库中最近7 天内的数据
- mh = );
- stepsInWeek = getSQLData("7");
- }
- .0f);
- canvas.drawLine(, , , , paint);
- paint.setStyle(s);
- paint.setStrokeWidth(strokewidth);//恢复画笔
- //把当前步数换算为在屏幕上绘制的条宽度
- );
- canvas.drawBitmap(back_cell, , , paint);
- paint.setColor(Color.BLACK);
- canvas.drawRect(width, , , +cellHeight, paint);
- //画出遮罩层
- ],
- width+, ,paint);
- isMoving = ], width+,
- ,paint);
- }
- drawDigit(canvas,width); //绘制数字
- }
- //画之前走过的步数
- ;i<stepsInWeek.size();i++){
- String os = stepsInWeek.get(i);
- , (cellHeight+
- distY)*i, paint); //画出渐变条
- paint.setColor(Color.BLACK);
- canvas.drawRect(width, tempY, , tempY+cell-
- Height, paint);
- paint.setTextAlign(Align.LEFT);
- paint.setColor(Color.CYAN);
- paint.setAntiAlias(,
- paint);
- }
- }
- //从数据库中获取历史数据
- ));
- }
- c.close();
- db.close();
- ;i<l;i++){
- ++*i, , ;
- ***;
- //Handler 延迟发
- //送消息的时延
- ;
- ;
- CommandReceiver receiver; //声明BroadcastReceiver
- Handler myHandler = );
- c.set(Calendar.HOUR_OF_DAY, );
- c.set(Calendar.MINUTE, );
- c.set(Calendar.SECOND, );
- );
- unregisterReceiver(receiver);
- , intent, );
- Notification myNotification = ,myNotification);
- }
本程序使用Handler 来定时发送消息, 收到消息后会调用uploadData 方法将今日走过的步数插入到数据库, 该方法的代码如下://方法:向数据库中插入今日走过的步数

- );
- SQLiteDatabase db = mh.getWritableDatabase();
- ContentValues values = ***);
- }
- }
、、
WalkingService 和WalingActivity 进行通信是通过注册CommandReceiver 组件来实现的, CommandReceiver 继承自BroadcastReceiver, 负责接收WalingActivity 发来的Intent。
CommandReceiver 类的代码如下:

- //开发继承自BroadcastReceiver 的子类接收广播消息
- );
- ,lastTime=; //记录时间
- ;
- ){
- ];
- ;i<;i++){
- preCoordinate = values;
- }
- }
- ;i<;i++){
- preCoordinate=values;
- }}
- lastTime = currentTime;//重新计时
- }
- }
- //方法:计算加速度矢量角度的方法
- ;
- ; //向量积
- ; //新向量的模
- ; //旧向量的模
- ;i<;i++){
- vectorProduct +=
- newPoints*oldPoints;
- newMold += newPoints*newPoints;
- oldMold += oldPoints*oldPoints;
- }
- newMold = (] < -)
- {
- audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- }
- ]));
- break;
- }
- }
- @Override
- protected void onResume()
- {
- // 注册重力感应监听事件
- sensorManager.registerListener(this, SensorManager.SENSOR_ORIENTATION);
- super.onResume();
- }
- @Override
- protected void onStop()
- {
- // 取消对重力感应的监听
- sensorManager.unregisterListener(this);
- super.onStop();
- }
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 通过SensorManagerSimulator对象获得重力感应服务
- sensorManager = (SensorManagerSimulator) SensorManagerSimulator
- .getSystemService(this, Context.SENSOR_SERVICE);
- // 连接到服务端程序(必须执行下面的代码)
- sensorManager.connectSimulator();
- }
- }
上面的代码中使用了一个SensorManagerSimulator类,该类在SensorSimulator工具包带的sensorsimulator-lib.jar文件中,可以在lib目录中找到这个jar文件。在使用SensorManagerSimulator类之前,必须在相应的Eclipse工程中引用这个jar文件。
现在运行本例,并通过服务端主界面右侧的【Roll】滑动杆移动到指定的角度,例如,-74.0和-142.0,这时设置的角度会显示在屏幕上,如图1和图2所示。
图1 翻转角度大于-120度
图2 翻转角度小于-120度
读者可以在如图1和图2所示的翻转状态下拨入电话,会发现翻转角度在-74.0度时来电仍然会响铃,而翻转角度在-142.0度时就不再响铃了。
转- android硬件传感器的更多相关文章
- Android Developers:传感器概述
大 多数Android设备有内置的传感器,来测量运动,方向和各种环境条件.这些传感器能提供高精度和准确度的原始数据,如果你想监控设备三维运动或者位 置,或者你想监控设备周围的环境变化,是非常有用的.例 ...
- Android常用传感器用法一览(3)
Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...
- 修复 XE8 for Android 方向传感器 headingX,Y,Z 不会动的问题
问题:XE8 for Android 方向传感器无法正常运作(在 XE7 是正常的) 测试:官方示例 Samples\Object Pascal\Mobile Snippets\Orientation ...
- Android实现传感器应用及位置服务
Android实现传感器应用及位置服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里需用获取加速度传感器和地磁传感器,手机获取旋转的方 ...
- Android加速度传感器
Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...
- Android Sensor——传感器
Android SDK 支持的传感器类型,在Sensor类中的定义: 01.TYPE_ACCELEROMETER : 加速传感器(硬件) 02.TYPE_AMBIENT_TEMPERATURE : ...
- Android常用传感器用法一览(2)
在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度#de ...
- Android常用传感器用法一览(1)
1.传感器入门自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分.如果读者使用过iPhone.HTC Dream.HTC Magic.H ...
- Android加速度传感器实现“摇一摇”,带手机振动
由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test; import android.app.Activity; im ...
随机推荐
- Android四大组件之Activity一(组件的概念、Intent、监听)
前言知识补充: 什么是组件? 1.它的类必须实现特定接口或继承特定类 2.需要在配置文件中配置其全类名 3.它的对象不是通过new来创建的, 而是系统自动创建的 4.它的对象具有一定 ...
- Android java传递int类型数据给C
本文根据<Android jni简便开发流程>中的开发流程来实现一个java传递int类型数据给C 新建项目,进行简单的布局 <LinearLayout xmlns:android= ...
- Android 生成xml文件
生成XML文件备份短信,其格式为: <?xml version="1.0" encoding="UTF-8" standalone="true& ...
- FMDB的简单使用
1.什么是FMDB? FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API. 无论项目中使用 ARC 还是 MRC,对 FMDB 都没有任何影响,FMDB ...
- RESTful API你怎么看?
关于RESTful 我结合自身实际工作经验说一说我的体验: 1. 统一资源定位方式 2. 统一行为方式 3. 简单统一就有力量 占位待续 如果觉得一个新东西学习门槛高,原因一般是什么? 约定太多,概念 ...
- LAMP配置虚拟目录
1. httpd.conf中添加 Listen 81 2. 1 <VirtualHost 127.0.0.2:81> 2 DocumentRoot E:\ws\2011\DiscuzSp ...
- 关于SQLSERVER2012版本远程登录问题
最近公司新配置了一台服务器,安装的数据库版本为sqlserver2012企业版本,一切安装正常,本地登录也正常 需要远程客户端登录,防火墙也开放的端口,路由器也做了端口映射,因为我们有两台服务器,14 ...
- css hover对其包含的元素进行样式设置
<ul class="icon-down-single-arr-li"> <li> <a href="javascript:void(0)& ...
- 写在复习MVC后
MVC的一些 今天把MVC复习了下,包括官方文档以及各种中文博客. 官方文档里面最能说明的问题的图片,相对于传统的MVC,苹果分离了View和Model之间的通信,实现了更好的复用性.我觉得MVC更 ...
- 安卓普通类通过classloader访问资源文件
Android studio不知道怎么设置,才可以在生成APK时把一些文件打包进去. 但是不管怎么样,放在res文件夹下的东西是一定得打包的.所以把一些资源文件放在res/raw这个文件夹里是科学的. ...