Android特色开发之传感器

简介:

 本文节选于机械工业出版社推出的《Android应用开发揭秘》一书,作者为杨丰盛。本书内容全面,详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用优化、OpenGL等高级知识。另外,本书还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用,并以迭代的方式重现了各种常用的Android应用和经典Android游戏的开发全过程。

第9章  Android特色开发

Android 是一个面向应用程序开发的丰富平台,它拥有许多具有吸引力的用户界面元素、数据管理和网络应用等优秀的功能。Android 还提供了很多颇具特色的接口。本章我们将分别介绍这些吸引开发者眼球的特色开发,主要包括:传感器系统(Sensor)、语音识别技术(RecognizerIntent)、Google Map和用来开发桌面的插件(Widget)。通过本章的学习,读者将对Android有一个更深入的了解,可以开发出一些有特色、有创意的应用程序。

9.1  传感器

据调查,2008年全球传感器销售额为506亿美元,预计到2010年全球传感器销售额可达600亿美元以上。调查显示,东欧、亚太区和加拿大成为传感器市场增长最快的地区,而美国、德国、日本依旧是传感器市场分布最大的地区。就世界范围而言,传感器市场增长最快的领域依旧是汽车,占第二位的是过程控制,当然现在也被广泛应用于通信。那么,传感器的定义是什么呢?有哪些种类的传感器呢?Android中提供了哪些传感器呢?

1.传感器的定义

传感器是一种物理装置或生物器官,能够探测、感受外界的信号、物理条件(如光、热、湿度)或化学组成(如烟雾),并将探知的信息传递给其他装置或器官。国家标准GB7665—87对传感器的定义是:“能感受规定的被测量并按照一定的规律转换成可用信号的器件或装置,通常由敏感元件和转换元件组成”。传感器是一种检测装置,能感受被测量的信息,并能将检测的感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。它是实现自动检测和自动控制的首要环节。

2.传感器的种类

可以从不同的角度对传感器进行分类:转换原理(传感器工作的基本物理或化学效应);用途;输出信号类型以及制作材料和工艺等。

根据工作原理,传感器可分为物理传感器和化学传感器两大类。

物理传感器应用的是物理效应,诸如压电效应,磁致伸缩现象,离化、极化、热电、光电、磁电等效应。被测信号量的微小变化都将转换成电信号。 

化学传感器包括那些以化学吸附、电化学反应等现象为因果关系的传感器,被测信号量的微小变化也将转换成电信号。 

大多数传感器是以物理原理为基础运作的。化学传感器的技术问题较多,例如可靠性问题、规模生产的可能性、价格问题等,解决了这些问题,化学传感器的应用将会有巨大增长。而有些传感器既不能划分为物理类,也不能划分为化学类。

3.Android中传感器的种类

Google Android操作系统中内置了很多传感器,比如G1自带了一个非常实用的加速感应器(微型陀螺仪),有了它,G1手机就支持重力感应、方向判断等功能,在部分游戏或软件中可以自动识别屏幕的横屏、竖屏方向来改变屏幕显示布局。下面是Android中支持的几种传感器:

 
  1. Sensor.TYPE_ACCELEROMETER:加速度传感器。  
  2. Sensor.TYPE_GYROSCOPE:陀螺仪传感器。  
  3. Sensor.TYPE_LIGHT:亮度传感器。  
  4. Sensor.TYPE_MAGNETIC_FIELD:地磁传感器。  
  5. Sensor.TYPE_ORIENTATION:方向传感器。  
  6. Sensor.TYPE_PRESSURE:压力传感器。  
  7. Sensor.TYPE_PROXIMITY:近程传感器。  
  8. Sensor.TYPE_TEMPERATURE:温度传感器。 

下面我们通过一个例子来分析Android中传感器的使用(具体实现参见本书所附代码:第9章\ Examples_09_01),这里分析的是方向传感器(TYPE_ORIENTATION)。

4.Android 中传感器的功能

要在Android中使用传感器,首先需要了解SensorManager和SensorEventListener。顾名思义,SensorManager就是所有传感器的一个综合管理类,包括了传感器的种类、采样率、精准度等。我们可以通过getSystemService方法来取得一个SensorManager对象。代码如下:

 
  1. SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 

 

取得SensorManager对象之后,可以通过getSensorList方法来获得我们需要的传感器类型,保存到一个传感器列表中。通过如下代码可以得到一个方向传感器:

 
  1. List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION); 

要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。Android中提供了registerListener来注册一个传感器,并提供了unregisterListener来卸载一个传感器。registerListener方法包括3个参数:第1个参数,接收信号的Listener实例;第2个参数,想接收的传感器类型的列表(即上一步创建的List<Sensor>对象);第3个参数,接收频度。调用之后返回一个布尔值,true表示成功,false表示失败。当然,之后不再使用时,我们还需要卸载。代码如下:

 
  1. //注册传感器  
  2.  Boolean  mRegisteredSensor = mSensorManager.registerListener(this, sensor,   
  3.  SensorManager.SENSOR_DELAY_FASTEST);  
  4.  //卸载传感器  
  5.  mSensorManager.unregisterListener(this);  

其中,SensorEventListener是使用传感器的核心部分,包括以下两个方法必须实现:

onSensorChanged (SensorEvent  event) 方法在传感器值更改时调用。该方法只由受此应用程序监视的传感器调用。该方法的参数包括一个SensorEvent对象,该对象主要包括一组浮点数,表示传感器获得的方向、加速度等信息。例如,以下代码可以取得其值:

 
  1. float x = event.values[SensorManager.DATA_X];  
  2. float y = event.values[SensorManager.DATA_Y];  
  3. float z = event.values[SensorManager.DATA_Z];  

onAccuracyChanged (Sensor sensor,int accuracy) 方法在传感器的精准度发生改变时调用。其参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。

具体实现如代码清单9-1所示。

代码清单9-1  第9章\Examples_09_01\src\com\yarin\android\Examples_09_01\Activity01.java

 
  1. public class Activity01 extends Activity implements SensorEventListener  
  2. {  
  3.     private boolean         mRegisteredSensor;  
  4.     //定义SensorManager  
  5.     private SensorManager       mSensorManager;  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         mRegisteredSensor = false;  
  11.         //取得SensorManager实例  
  12.         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  13.     }  
  14.     protected void onResume()  
  15.     {  
  16.         super.onResume();  
  17.         //接收SensorManager的一个列表(Listener)  
  18.         //这里我们指定类型为TYPE_ORIENTATION(方向传感器)  
  19.         List<Sensor> sensors = mSensorManager.getSensorList  
  20.         (Sensor.TYPE_ORIENTATION);  
  21.         if (sensors.size() > 0)  
  22.         {  
  23.             Sensor sensor = sensors.get(0);  
  24.             //注册SensorManager  
  25.             //this->接收sensor的实例  
  26.             //接收传感器类型的列表  
  27.             //接收的频率  
  28.             mRegisteredSensor = mSensorManager.registerListener(this,   
  29.             sensor, SensorManager.SENSOR_DELAY_FASTEST);  
  30.         }  
  31.     }  
  32.     protected void onPause()  
  33.     {  
  34.         if (mRegisteredSensor)  
  35.         {  
  36.             //如果调用了registerListener  
  37.             //这里我们需要unregisterListener来卸载/取消注册  
  38.         mSensorManager.unregisterListener(this);  
  39.             mRegisteredSensor = false;  
  40.         }  
  41.         super.onPause();  
  42.     }  
  43.     //当精准度发生改变时  
  44.     //sensor->传感器  
  45.     //accuracy->精准度  
  46.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
  47.     {  
  48.         //处理精准度改变  
  49.     }  
  50.     // 当传感器在被改变时触发  
  51.     public void onSensorChanged(SensorEvent event)  
  52.     {  
  53.         // 接收方向传感器的类型  
  54.         if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)  
  55.         {  
  56.             //这里我们可以得到数据,然后根据需要来处理  
  57.             //由于模拟器上面无法测试效果,因此我们暂时不处理数据  
  58.             float x = event.values[SensorManager.DATA_X];  
  59.             float y = event.values[SensorManager.DATA_Y];  
  60.             float z = event.values[SensorManager.DATA_Z];  
  61.         }  
  62.     }  

上面的例子中演示了如何获得方向传感器的方向、加速度等信息,我们可以根据得到的数值与上一次得到的数值之间的关系来进行需要的操作。SensorManager中还有很多常量和一些常用的方法,如下:

 
  1. getDefaultSensor:得到默认的传感器对象。  
  2. getInclination:得到地磁传感器倾斜角的弧度值。  
  3. getOrientation:得到设备旋转的方向。  
  4. getSensorList:得到指定传感器的列表。 






本文转自 yarin 51CTO博客,原文链接: http://blog.51cto.com/yarin/478994 ,如需转载请自行联系原作者
相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
27天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
14 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
103 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
1月前
|
机器学习/深度学习 调度 Android开发
安卓应用开发:打造高效通知管理系统
【2月更文挑战第14天】 在移动操作系统中,通知管理是影响用户体验的关键因素之一。本文将探讨如何在安卓平台上构建一个高效的通知管理系统,包括服务、频道和通知的优化策略。我们将讨论最新的安卓开发工具和技术,以及如何通过这些工具提高通知的可见性和用户互动性,同时确保不会对用户造成干扰。
33 1
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
21天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
21天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
22 1
Android开发之使用OpenGL实现翻书动画
|
21天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
18 1
Android开发之OpenGL的画笔工具GL10