基于Android智能手机的方向传感器应用开发
陈三清+张靖
摘要:传感器的应用是智能手机的一大亮点,方向传感器在Android手机上有着重要的应用。文章首先介绍了Android传感器系统架构和方向传感器的特点,然后论述了Android方向传感器应用开发的要素,如传感器应用开发主要的类和接口及方向传感器定位的基本原理,重点讲述了简易指南针程序的开发步骤及要点,最后给出了程序测试的结果。
关键词:Android;方向传感器;指南针
随着智能手机的广泛使用,基于智能手机的应用也层出不穷,许多基于手机硬件或传感器芯片的手机APP受到了人们的热爱和追捧。比如基于GPS芯片的定位与地图服务几乎就是智能手机的标准功能,基于光线传感器的智能手机是随环境光线强弱自动改变屏幕亮度的,而基于陀螺仪传感器的无人机飞控APP,基于加速传感器的人体计步器APP,基于方向传感器的手机游戏应用等是当前Andrmd应用开发的热门方向。本文专门针对Android方向傳感器特点进行分析,在此基础上开发应用程序。
1Android传感器基础
1.1Android传感器系统架构
现在的智能手机不仅是信息的载体,也是许多传感器设备的载体,像重力传感器、磁场传感器、光线传感器、陀螺仪传感器等传感设备极大地增强了智能手机的用户体验[1]。一般传感器系统会主动对上层报告传感器精度和数
据的变化,并且提供了设置传感器精度的接口,这些接口可以在Java应用和Java框架中使用。Android平台下传感器系统的基本层次结构[2]如图1所示。
Android传感器系统架构从上到下依次是Java应用层、Java对传感器的应用开发框架层、传感器硬件抽象层及传感器硬件层,其中Sensor的Java类属于应用开发框架层,此部分对应的实现文件是Sensor*Java;传感器系统的JNI部分提供了对类Android.hardware.Sensor.Manage的本地支持,在Andrmd平台下基于传感器的应用程序开发一般要使用应用开发层的相关的类和接口。
1.2Android方向传感器的特点
方向传感器(Sensor.TYPE_ORIENTATION)又称姿态传感器,方向传感器通过对力每I感的传感器,感受手机等设备在变换姿势时重心变化,使手机等设备光标变化位置,从而实现选择的功能。方向传感器是Android平台提供的用于判别设备位置的传感器之一,事实上,磁场传感器属于硬件传感器,方向传感器属于软件传感器,其数据是通过加速度传感器和磁场传感器共同获得的,通过方向传感器获取的数据可以方便快捷地进行数据应用和展示。
2Android方向传感器应用开发的要素
2.1ASF简介
所谓ASF就是AndroidSDK提供的Androidsensorframework(Android传感器框架),其作用是用来访问当前Android设备内置的传感器,帮助完成各种与传感器有关的任务。例如:确定当前Android手机支持什么类型的传感器,支持的传感器硬件信息以及测量范围、精度等方面的信息;获取传感器传回来的数据以及定义传感器回传的数据的精度;注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。
2.2ASF的主要类和接口
Andrcnd传感器应用开发一般要用到下面的类和接口[3]。
2.2.1SensorManager类
SensorManager类是系统中所有传感器的管理类,通过该类实例获得对传感器的管理服务,包括访问和列表所有传感器,注册和注销传感器服务等。
2.2.2Sensor类
Sensor类定义了传感器服务的类型,如Sensor.TYPE_GRAVITY定义的是重力传感器,Sensor.TYPE_TEMPERATURE定义的是温度传感器,而Sensor.TYPE_
ORIENTATION定义的是方向传感器,在编程时由此可判断是何种类型的传感器传送的数据。
2.2.3SensorEvent类
SensorEvent类是对传感器事件的描述,提供传感器事件相关的信息,比如传感器类型、传感器数据、数据精度等等信息。
2.2.4SensoriEventListener接口
SensorEventListener接口用于传感器数据对编程开发者的回调,使用该接口的回调方法获得传感器的数据和状
2.3方向传感器定位的基本原理
方向传感器属于位置类传感器,通过该类传感器可以感应手机的地理坐标,并且反馈给用户。方向传感器主要通过感应手机方位的变化来捕获3个方位的参数,即手机沿X轴、Y轴和Z轴转过的角度(见图2)[4-6]。
然后可以通过Sensor类的size()和getName()方法获得所支持传感器总的个数及传感器设备名称,或使用getVendor()获得传感器供应商信息,使用getVersion()取得设备版本信息等。
3.2传感器服务的注册
一般地,传感器服务要随着程序状态的变化而变化。在本例中,利用Activity实现程序界面时,在重写onResume()方法时,可在其中启用传感器服务:
@Override
protected void onResume0 {
super.onResume0;
List
getSensorList(Sensor.TYPE_ ORIENTATION);
if (sensorsList.size0 > 0) {
sManager.registerListener(this, sensorsList.get(0),
SensorManager. SENSOR DELAY_GAME);//注册方向传感器,并设置传感器采样方式SENSOR DELAY_GAME}
为了降低功耗,在退出应用或锁屏等操作时,应关闭传感器服务,此时可在Activity处在暂停或停止状态时注销服
务,如下在onPause0方法中注销传感器服务:
@Override
protected void onPause(){
super.onPause();
sManager.unregisterListener(this);
}
3.3 SensorEventListener接口的实现及指向方位旋转的实现
要使用传感器的数据及状态信息,就必须要实现SensorEventListener接口,通过其回调方法的参数获得,有两个方法:
public void onAccuracyChanged(Sensor sensor. int
accuracy);
public void onSensorChanged(SensorEvent event);
其中,第一个方法是传感器设备的精度产生变化时回调:第2个方法是传感器设备的数据产生生变化时回调。在设计本例程序时只需第2个方法,通过SensorEvent类的参数event获得传感器状态信息和数据信息。通过event.values[0]获得沿Z轴旋转角度,再使对指南针图片获得相应的旋转角度,以下是实现的关键代码[1]:
@Override
public void onSensorChanged(SensorEvent event){
int sensorType=event.sensor.getType();//获取触发
event的传感器类型
switch(sensorType){
case Sensor.TYPE ORIENTATION:
tvl.setText(“手机沿Z轴转过的角度为:”+event.
values[0]);
tv2.setText(
values[l]);
tv3.setText(
values[2]);
“手机沿Y轴转过的角度为:”+event.
“手機沿X轴转过的角度为:”+event.
float degree=event.values[0];∥获取z轴转过的角度
RotateAnimation ra=new RotateAnimation
(currentDegree:degree,
Anirnation.RELATIVE__TO_SELF,0.5f,Animation.
RELATIVE TO_SELF,0.5f);
//穿件旋转动画
ra.setDuration(300);//动画持续时间
image.startAnimation(ra);
currentDegree=-degree;
break;)
}
4运行结果及分析
程序测试运行结果,手机水平放置时约“正北”和“正南”时的情况如图3—4所示,由于指南针所需确定方位的数据只需event.values[0],所以只需关注“手机沿Z轴转过的角度”;再者设置传感器采样速率较快,显示数据是十分灵敏的,因而截图显示的数值在“标准”数值附近,不是严格准确的;event.values[0]的范围是0?360,故显示350?359之间的数值时,也大约处在“正北”的位置,其他情况类似判断。
[参考文献]
[1]尹邦杰,黄晓莹.浅析Android手机传感器机制及应用设计举例[J].计算机光盘软件与应用,2013(5):148.
[2]孙广宇,张玲玲.Android物联网开发从入门到实战[M].北京:清华大学出版社,2016.
[3]REDOWU.如何获取Android设备所支持的传感器种类[EB/OL].(2016-09-12)[2017-09-25]_http://blog.csdn.net/redoq/article/details/52515123.
[4]张舒.基于Android平台的无线传感器应用层开发[D].北京:北京邮电大学,2012.
[5]田志贡,阮国庆,石峰.手机游戏开发中Android传感器的应用研究[J].无线互联科技,2015(7):123-124.
[6]蔡泽江,唐国纯.基于Android传感器技术的游戏开发应用[J].软件,2014(9):38-42.