转- 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 隐式意图激活另外一个Actitity
上篇文章<Android 显示意图激活另外一个Actitity>最后谈到显示意图激活另外一个Actitity会有一些局限性和弊端 本文介绍另一种方法:隐式意图激活另外一个Actitity ...
- iOS UITableView , UITableViewController ,UITableViewCell实现全国各省市遍历,选择相应的地区
我们先看一下效果 代码如下 首先是第一个页面 rootTableViewController.h #import <UIKit/UIKit.h> #im ...
- Swift中的部分更新与旧版的区别
1. 函数中的外部变量名取消 “#”方式,仅能用直接命名方式 错误 func swift(#str :NSString){} 正确 func swift(str str :NSString){} 2. ...
- Asp.net MVC使用Filter解除Session, Cookie等依赖
本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...
- Lojic X
媒体 赫兹 电话 500HZ 网络数据 8000HZ CD 44100HZ 电脑 48000HZ DVD 96000HZ 最大值(蓝光) 192000HZ 横向———————— 清晰度 ...
- org.apache.hadoop.ipc.RemoteException(java.io.IOException)
昨晚突然之间mr跑步起来了 jps查看 进程都在的,但是在reduce任务跑了85%的时候会抛异常 异常情况如下: 2016-09-21 21:32:28,538 INFO [org.apache.h ...
- [MySQL Reference Manual] 5 MySQL 服务管理
5. MySQL 服务管理 5. MySQL 服务管理 5.1 The Mysql Server 5.2 Mysql 服务日志 5.2.1 选择General query log和slow query ...
- hadoop2.4.1集群搭建
准备Linux环境 修改主机名: $ vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop001 修改IP: # vim /etc/sys ...
- SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持
SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持.在安装了 SQL Server 2000 之后请应用 sp3. 出现这种现象的原因在于:Windows Serve ...
- 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
package com.hanqi.test; //银行账号 public class account { private String zhanghao;//账号 //私有余额 private do ...