iphone用的安卓模拟器传感器,SENSOR_TYPE_FACE_DOWN是在哪个API添加的函数!

大家好啊,这是本人的第一篇博客,最近在搞安卓的传感器开发,在这篇文章里我详述了基于SensorSimulator的传感器开发步骤。使用SensorSimulator可以在没有手机的情况下在电脑上模拟手机的姿态,来测试比如像用到方向传感器一类的程序。希望对大家有所帮助。

0.启动eclipse,新建2.3.3版本的工程,启动2.2.3版本的模拟器。

登录下载SensorSimulator-2.0,解压后里面有很多文件夹,其中“bin”“lib”是最有用的两个文件夹。将所有的文件夹放到D盘的根目录下。

打开CMD窗口,进入D盘下的“bin”文件夹。

橙色的字是本机的IP地址,一会儿要用到。

在安卓模拟器中找到刚才新安装的SettingsAPK,打开之后,进行相关设置,可参考中的第4步。这里要注意IP地址的设置,上面列出的橙色的地址有好几个,如果第一个不行,可以试试后面几个。连接完成后就可以编写程序了。

2.导入第三方的JAR

在编写程序的时候,要用到第三方的JAR包,需要将“lib”文件夹里的JAR包导入自己的安卓工程。笔者在这一步上花了很多时间,很多导入JAR包的方法都不正确,程序运行时会报错。

这里我将自己的程序附上,希望对大家有所帮助。

本篇blog是我的“进阶”的第一篇文章,从初学Android到现在断断续续也有4个多月时间了,也算是有了一些自己的心得体会,也能自己独立做一些东西了,这都要感谢我们公司的安卓开发璟博和无所不能的鸿洋给我的帮助和指点。本系列blog将记录我在开发中、学习中遇到的较为重点的、值得记录的知识点和技巧,简单的说就不再是基础教程了。由于项目中需要用到方向传感器,所以就借此机会来学一学Android的传感器部分的知识了,自然也就是本篇blog的内容了。

官方文档说的很清楚,Android平台支持三大类的传感器,它们分别是:

从另一个角度划分,安卓的传感器又可以分为基于硬件的和基于软件的。基于硬件的传感器往往是通过物理去实现的,他们通常是通过去测量特殊环境的属性获取数据,比如:重力加速度、地磁场强度或方位角度的变化。而基于软件的传感器并不依赖物理设备,尽管它们是模仿基于硬件的传感器的。基于软件的传感器通常是通过一个或更多的硬件传感器获取数据,并且有时会调用虚拟传感器或人工传感器等等,线性加速度传感器和重力传感器就是基于软件传感器的例子。下面通过官方的一张图看看安卓平台支持的所有传感器类型:




使用传感器的话那么首先需要了解的必然是传感器API了,在Android中传感器类是通过Sensor类来表示的,它属于android.hardware包下的类,顾名思义,和硬件相关的类。传感器的API不复杂,包含3个类和一个接口,分别是:<喎?"/kf/ware/vc/" target="_blank"

右上角标有1的是在Android1.5版本添加的,并且在Android2.3之后就无法使用。

右上角标有2的是已经过时的。

很明显,我们需要用到的方向传感器TYPE_ORIENTATION就已经过时了,后面再说用什么来替代它。

最后看一下常用的传感器的方法:

下面就通过这两个方法看一下手机支持哪些传感器,并以列表数据展示出来,代码很简单:

// 实例化传感器管理者 // 得到设置支持的所有传感器的List

最后看一下真机的效果图:


了解了传感器的基础知识,下面我们就具体看看我们需要用到的Orientation Sensor。

至于具体算法Android平台已经封装好了我们不必去关心实现,下面在了解方向传感器之前我们还需要了解一个重要的概念:传感器坐标系统(Sensor Coordinate System)。

在Android平台中,传感器框架通常是使用一个标准的三维坐标系去表示一个值的。以方向传感器为例,确定一个方向当然也需要一个三维坐标,毕竟我们的设备不可能永远水平端着吧,准确的说android给我们返回的方向值就是一个长度为3的float数组,包含三个方向的值。下面看一下官方提供的传感器API使用的坐标系统示意图:


仔细看一下这张图,不难发现,z是指向地心的方位角,x轴是仰俯角(由静止状态开始前后反转),y轴是翻转角(由静止状态开始左右反转)。下面切入正题,看看如何通过方向传感器API去获取方向。结合上面的图再看看官方提供的方向传感器事件的返回值:


这样就和上面提到的相吻合了,确实是通过一个长度为3的float数组去表示一个位置信息的,并且数组的第一个元素表示方位角(z轴),数组的第二个元素表示仰俯角(x轴),而数组的第三个元素表示翻转角(y轴),最后看看代码怎么写。


虽然这样做没错,但是如果你在IDE中写了这样一行代码的话,不难发现它已经过期了,但是没关系,我们先用这个看看,后面再介绍代替它的方法。

下面是创建一个自定义传感器事件监听接口:

当设备位置发生变化时触发监听,界面上的值改变,由于模拟器无法演示传感器效果,真机也没有root没法用屏幕投影啥的,所以就贴一张截图象征性看一下,这几个值无时无刻都在变化:


由于我在截图的时候手机是水平端平的,所以后两个值都接近于0,而第一个方位角就代表当前的方向了,好了,现在功能基本算实现了,那么现在就解决一下Sensor类的常量过期的问题。不难发现,在IDE中这行代码是这样的:

既然过期了必定有新的东西去替代它,我们打开源代码可以看到这样的注释:


再看一下这个方法的注释中的一句话:


第一行讲了这个方法的作用,计算设备的方向基于旋转矩阵,这个旋转矩阵我们当成一种计算方向的算法就OK了,不必深究,下面再看我标出来的这句话,很明显说明了我们通常不需要这个方法的返回值,这个方法会根据参数R[ ]的数据填充values[ ]而后者就是我们想要的。既然不需要返回值,那么就是参数的问题了,这两个参数:float[ ] R 和 float[ ] values该怎么获取呢?继续看注释,首先是第一个参数R:


既然这个方法是基于旋转矩阵去计算方向,那么第一个参数R自然就表示一个旋转矩阵了,实际上它是用来保存磁场和加速度的数据的,根据注释我们可以发现让我们通过getRotationMatrix这个方法来填充这个参数R[ ],那我们就再去看看这个方法源码,依旧是SensorManager的一个静态方法:

依旧是4个参数,请观察30~41行之间的代码,不难发现这个旋转矩阵无非就是一个3*34*4的数组,再观察一下if语句块中的代码,不难发现给数组元素依次赋值,而这些值是从哪里来的呢?我们29行倒着看,直到第4行,不难发现其实最后的数据源是通过这个方法的后两个参数提供的,即:float[]


到这里应该就清晰了吧,分别是从加速度传感器和地磁场传感器获取的值,那么很明显,应当在监听中的回调方法onSensorChanged中去获取数据,同时也验证了上面的判断方向需要两个传感器的说法,分别是:加速度传感器(Sensor.TYPE_ACCELEROMETER)和地磁场传感器(TYPE_MAGNETIC_FIELD)。

说完了getRotationMatrix方法的后两个参数,那么前两个参数RI又该如何定义呢?其实很简单,第一个参数R就是getOrientation()方法中需要填充的那个数组,大小是9。而第二个参数I是用于将磁场数据转换进实际的重力坐标系中的,一般默认设置为NULL即可。到这里关于方向传感器基本就已经介绍完毕,最后看一个完整的例子:

// 实例化传感器管理者 // 初始化加速度传感器 // 初始化地磁场传感器

第一次研究Android传感器感觉还是挺难的,继续努力吧,要学的东西还有很多,先去给Map项目集成指南针啦~

前面,带着大家一起写了一个temperature sensor的驱动,已经一个测试tool来测试这个驱动,基本功能已经ok,若还有问题的可以参考前面2篇文章,在这里我们要在HAL层中添加我们的设备,来跟framework中的代码连接起来。

在开始摆代码之前我觉得有必要啰嗦几句,HAL层我个人觉得是个比较重要的东西,虽然这边现在还不是很成熟,还不是很规范,但是google还是做了很大力气针对HAL的。

Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。


这个是google定义的android整个系统的架构,大家可以看到HAL层起了一个承上启下的作用,HAL层主要是针对一些传感器和一些个硬件而存在的,其实也可以绕过HAL层直接使用JNI来实现从驱动到framework这个过程,但是我们这里主要是讲android中的sensor,针对标准的android而言,sensor都是在HAL中添加的,个人理解还是呼应硬件厂商的建议吧,毕竟这部分代码还可以不开源的。

好了,开源不开源什么的,我是不去关心,对我影响不大,我们还是接着看HAL。

Android硬件抽象层,从下到上涉及到了Android系统的硬件驱动层、硬件抽象层、运行时库和应用程序框架层等等,下图描述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:


到此,都是些理论的东西,实在是不想讲这些条条杠杠的,从小语文就不好的我,最讨厌的就是这些理论的东西了,实践才是真理呢。。。

好了接下来轮到我们的sensor的HAL层了,这里先列出来主要用到的代码:

讲漏了,这边sensor的HAL层代码我参考的是freescale的BSP,因为个人感觉比较容易懂,哈哈。

先给下载链接,不然大家看不到完整的代码。


这里我们要修改以及添加的是三个文件:

好了,接下来就带大家分析下android sensor的HAL层!!!

这2个文件是android hal层最重要的两个文件,其中定义了hal层主要要实现的3个结构体,

其实标准的android hal就是实现这3个结构体,然后设置一些回调函数,最后把数据poll到framework中。

好,接下来看下sensor中是怎么封装的:

这里面的Android Temperature Sensor就是我们自己添加的sensor,然后我们去实现我们的temperature sensor的功能,也就是填充一些结构体和实现一些回调函数,这里我挑重要的讲。

这里我要提醒大家,如果对自己不够有信心的话第一次写hal层代码的时候最好多加点debug message,因为在hal层的调试比较麻烦,出现的错误会直接导致系统不断重启,不会告诉你错哪,所以,最好自己加debug message来调试。

代码方面大家可以看下Temperature.h和sensor.cpp这两个文件里面要实现的一些类和结构体,按照规范写好回调函数就ok了,大家自行分析绰绰有余。

这个函数在哪呢?在这:

看下这里的load函数:



大家可以看到这里的第25行,OK 找到了,这里找到了这个动态库的地址,然后就可以一次找到这个动态库中的函数,最终可以被调用。

这里我只是大致分析了一下这个流程,对于代码是如何编写的,大家可以参考我提供的下载,其实android hal层就是填充一些“规则”。
下面一节我们来编写一个测试apk来抓我们的温度,之后再来分析framework层,因为到这里我们sensor的移植就结束了,framework层中android已经帮我们把api都写好了,也就是说sensor是android的标准api,我们不需要自己去搭建。

我要回帖

更多关于 iphone用的安卓模拟器 的文章

 

随机推荐