到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕。而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于树根,也就是应用程序通过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. NOIP 模拟五 考试总结

    T1string T1开的不错,看到这个题很激动,类似与HEOI2016排序,好像还要更简单一些,于是迅速冲了个桶排.因为洛谷上排序那道题是用桶排水的,所以我觉得没必要打线段树了,极端大数据20秒冲过 ...

  2. Go语言核心36讲(导读)--学习笔记

    目录 开篇词 | 跟着学,你也能成为Go语言高手 导读 | 写给0基础入门的Go语言学习者 导读 | 学习专栏的正确姿势 开篇词 | 跟着学,你也能成为Go语言高手 Go 语言是由 Google 出品 ...

  3. 对于caffe程序中出现的Unknown database backend问题的报错怎么办?

    在预处理器中添加USE_LMDB,因为caffe需要一种数据输入格式 这样,在db.cpp中#ifdef USE_LMDB就会变亮,显示使用的数据格式为LMDB

  4. 洛谷3119 草鉴定(tarjan)

    题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...

  5. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧

    上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...

  6. python中return的返回和执行

    1 打印函数名和打印函数的执行过程的区别 例子1.1 def a(): print(111) print(a) # 打印a函数的内存地址,不会对a函数有影响,a函数不会执行 print(a()) # ...

  7. airtext初始化(一)

  8. 【二食堂】Beta - 发布声明

    Beta - 发布声明 新功能 在Beta阶段,图谱方面的新功能有:自定义关系的添加与删除.实体查找.实体名称的修改.实体之间关系的修改.新增了项目创建与删除功能,此外还增加了好友系统,可以实现好友的 ...

  9. 第五次Scrum Metting

    日期:2021年5月2日 会议主要内容概述:讨论前端进度,修改后端接口. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 模板模块的实现及批量插入更 ...

  10. hystrix的配置说明

    在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统 ...