转- 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 ...
随机推荐
- NDK-JNI实战教程(二) JNI官方中文资料
声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- 1.4 基础知识——GP2.2 计划 与 GP2.8 计划跟踪
摘要: CMMI有计划(PP)及计划跟踪(PMC)两个PA,而某一个PA又有GP2.2计划及GP2.8计划跟踪两个GP,看上去是挺“神奇”也挺让人“困惑”的事情. 正文: GP2.2 Establis ...
- MySQL Proxy
最近翻看了mysql proxy的资料,特发上来. mysql proxy的推荐使用方式是采用配置文件来完成,当前在命令行的执行如下:mysql-proxy -P 192.168.1.101:3306 ...
- nutz如何体现mvc思想的
如何理解web mvc框架?? 一.没有使用mvc框架之前我们都是自己根据mvc分层思想的理解去把它物理化,比如:根据包的命名,根据类的后缀名,根据文件夹的命名去定义分层. 因为每个人对mvc的理解不 ...
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- WCF绑定和行为在普通应用和SilverLight应用一些对比
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 阅读目录 介绍 绑定 普通应用和SilverLight应用区别 本文版权归mephisto和博客园共有, ...
- Linux服务器文件删除空间未释放的问题
一.问题起源 在Linux系统中,通过rm删除文件将会从文件系统的目录结构上解除链接(unlink),如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件磁盘空间也一直被占用 这样就 ...
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅳ部分
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- mysql截取longblob类型字段内一小块数据的方法
由于longblob类型的字段内容一般都好大,最大限制是4G,所以在数据查询中读取一整块数据的方式是不现实的,这需要要截取的方法来获取需要的数据. 方法如下: hex(substring(A, ind ...