到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕。而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于树根,也就是应用程序通过Android系统与设备上硬件的交互。

设备硬件

设备的硬件目前主要分为三大类,包括传感器系列硬件(重力传感器、加速度传感器、陀螺仪、位置传感器、光亮传感器等),互联通信系列硬件(SIM卡,无线WLAN,蓝牙、NFC、USB等),多媒体系列硬件(麦克风、播放器、相机等)。

虽然设备硬件五花八门,但是在系统层都遵循各自的硬件协议封装了一层,而在应用程序内部只需要使用系统层提供的相关接口即可。不管是对哪种硬件的访问,首要步骤都是在应用程序的清单文件中,使用<uses-permission>标签声明要使用的相关权限。

而对于某些设备非必需硬件,应用程序中可使用<uses-feature>标签声明对某些硬件的需求,以兼容应用程序在没有该硬件的设备上运行。

注意,使用<uses-feature>标签声明的硬件需求,在应用程序安装到设备时,并不会检查该设备是否支持相关需求硬件,而只是在其他服务如官方Google Play中、或应用程序内部运行到相关硬件支持代码时,检测相关声明。

传感器系列硬件

权限声明

对于传感器系列硬件,需要声明权限名称为Manifest.permission.BODY_SENSORS,另外,在Android10.0即API 31及以上的版本中,还可以使用Manifest.permission.HIGH_SAMPLING_RATE_SENSORS权限以更快速的刷新获取传感器的数据。

使用流程

与传感器系列硬件的交互,主要借助android.hardware.SensorManager传感器管理类,该类的对象,可以在能获取上下文环境Context对象的地方,调用其getSystemService(Context.SENSOR_SERVICE)获取系统服务对象,将返回的结果类型强制转换为SensorManager类型即可。

在得到SensorManager传感器管理类的对象后,可以调用其getSensorList(int type)方法,参数 type 可以指定为代表所有传感器类型的Sensor.TYPE_ALL=-1,也可以指定某一类具体的传感器,这些类型及数值都是在android.hardware.Sensor传感器类中定义的静态常量。而该方法的返回结果,也是List<Sensor>传感器集合,里边包含了当前系统所在设备的所有可使用的传感器信息。

而如果设备中有多个同一类型的传感器,可以调用getDefaultSensor(int type)方法,参数 type 同样是指定的某一种传感器类型,返回该类型传感器所使用的默认一个Sensor传感器对象,如果系统硬件中没有正常使用该类型的传感器,则会返回null

对于通过传感器管理类对象找到的Sensor传感器对象,可以调用其getX()系列方法,获取传感器的一些基本信息,方法名中的X包括IdNameVersion等。

在找到匹配的Sensor传感器对象后,就可以在合适的时机,开启实时监测该传感器获得的数据,以及在合适的时机,关闭对该传感器数据的监测活动。通常为了节省资源,在界面ActivityonResume()方法中开启监测,并在对应的onPause()方法中关闭监测。

开启监测是调用SensorManager对象的registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs, int maxReportLatencyUs, Handler handler)方法。参数 listenerandroid.hardware.SensorEventListener传感器事件监听器接口所实现的对象,在传感器发出数据时会回调该对象所实现的方法;参数 sensor 则是上文所匹配的要检测的Sensor传感器对象;参数 samplingPeriodUs 是用int类型标记的监测频率,其值是SensorManager中定义的静态常量,包括正常频率SENSOR_DELAY_NORMAL=3, 稍微快一点以在界面更新时的频率SENSOR_DELAY_UI=2, 再快一点以在游戏更新时的频率SENSOR_DELAY_GAME=1, 和最快的频率SENSOR_DELAY_FASTEST=0;参数 maxReportLatencyUs 为可选参数,是int类型表示传感器更新数据后回调上文监听接口对象的方法时的最大延时,单位是毫秒,且默认值为0;参数 handler 同样为可选参数,传感器发出的数据在回调上文的监听器接口对象后,也会交付到该Handler类型的对象中处理,默认值为null。

关闭监测是调用SensorManager对象的unregisterListener(SensorEventListener listener, Sensor sensor)方法。参数 listener 即在开启监测方法中传入的SensorEventListener监听器接口对象;参数 sensor 是可选参数,为开启监测方法中传入的Sensor传感器对象,当该参数默认值为null时,则会对所有开启参数 listener 监听的传感器对象的监测活动都关闭。

在该SensorEventListener传感器事件监听接口的实例化对象中,需要实现两个方法,包括onAccuracyChanged(Sensor sensor, int accuracy),和onSensorChanged(SensorEvent event)方法。

其中,onAccuracyChanged(Sensor sensor, int accuracy)方法会在传感器的精确度发生变化时回调,其参数 sensor 为发生变化的Sensor传感器对象;参数 accuracyint类型的标记,由SensorManager定义的静态常量,其值包括传感器数据不允许应用程序访问的SENSOR_STATUS_NO_CONTACT=-1,传感器需要校准或无法正常访问的SENSOR_STATUS_UNRELIABLE=0,低精确度需要校准的SENSOR_STATUS_ACCURACY_LOW=1。普通精确度可以检测平均值的SENSOR_STATUS_ACCURACY_MEDIUM=2,高精确度非常精准的SENSOR_STATUS_ACCURACY_HIGH=3

onSensorChanged(SensorEvent event)方法会在传感器更新数据时回调,其参数 eventandroid.hardware.SensorEvent传感器事件类,该类型中包含了Sensor传感器以及更新的float[]数据等信息,其中的数据数组长度及内容,则是根据传感器的不同类型所确定的。

应用场景

类似指南针类应用,计步器类应用,自动调节屏幕亮度等功能,都是依靠传感器系列硬件实现的。应用程序借助传感器系列硬件,感知外界环境的动态变化,从而实时展示给用户查看,而这个数据流向是单向的。

Android系统编程入门系列之硬件交互——传感器的更多相关文章

  1. Android系统编程入门系列之硬件交互——多媒体摄像头

    多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...

  2. Android系统编程入门系列之硬件交互——通信硬件USB

    在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...

  3. Android系统编程入门系列之硬件交互——通信硬件Bluetooth

    通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...

  4. Android系统编程入门系列之硬件交互——通信硬件NFC

    在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...

  5. Android系统编程入门系列之硬件交互——无线通信WLAN

    Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...

  6. Android系统编程入门系列之硬件交互——通信硬件电信SIM卡

    现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...

  7. Android系统编程入门系列之硬件交互——多媒体麦克风

    在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...

  8. Android系统编程入门系列之硬件交互——多媒体展示

    前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外 ...

  9. Android系统编程入门系列之加载界面Activity

    上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...

随机推荐

  1. Skywalking-12:Skywalking SPI机制

    SPI机制 基本概述 SPI 全称 Service Provider Interface ,是一种服务发现机制.通过提供接口.预定义的加载器( Loader )以及约定俗称的配置(一般在 META-I ...

  2. 踩坑系列《一》数据库建表权限 CREATE command denied to user for table

    今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...

  3. Java网络爬虫技术《一》 HttpClient

    HttpClient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP ...

  4. 测试rac数据文件建本地及处理

    模拟用户zytuser的表空间ZYTUSER_TBS表空间添加数据文件到本地.--环境准备1.创建一个表空间--创建表空间create tablespace ZYTUSER_TBS datafile ...

  5. SQL实例_11Oracle基本操作

    前言导读 本章介绍了在正常使用Oracle数据库之前进行的常规操作 本章语句的运行需要子啊PLSQL软件中运行 本章导入导出语句需要在虚拟环境中直接运行 1 Oracle创建表空间和用户 --1 创建 ...

  6. Miller-Rabin学习笔记

    首先给出两个定理: 1.费马小定理 设p是一个素数,a是一个整数,且不是p的倍数,那么 \(a^{p−1} \equiv\ 1 \pmod p\) 2.二次探测定理 若\(p\)是素数,\(x\)是一 ...

  7. ServletContext 学习

    ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 ​ 在这个Servlet中保存了数 ...

  8. 【日志技术专题】「logback入门到精通」彻彻底底带你学会logback框架的使用和原理(入门介绍篇)

    技术介绍 什么是 logback? Logback为取代 log4j 而生.Logback 由 log4j 的创立者 Ceki Gülcü设计.以十多年设计工业级记录系统的经验为基础,所创建的logb ...

  9. 初学Python “登录”案例 更新!!

    更新内容:添加了登录次数,如果超过限制的次数,则提示账户被锁定,去某邮箱申请解锁账户! 此次仅把登录系统更新之后源代码放到这里,不在共享源文件在网盘了! 1 ''' 2 登录界面 3 ''' 4 5 ...

  10. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...