安卓传感器开发 - cs.nju.edu.cn
TRANSCRIPT
安卓开发中的感知技术
■ IMU(惯性测量单元)
○ 一般包含加速度计和陀螺仪
■ 触摸屏
■ 音频(声音信号)
■ Camera
■ 安卓开发平台:Android studio
IMU
■ 简介及用途○ IMU是测量物体三轴姿态角(或角速率)以及加速度的装置,并可以以
此解算出物体的姿态。在导航定位、行为感知和识别等领域有着很重要的应用价值。
■ Android开发接口API○ Android对IMU的传感器都进行了抽象与封装
■ SensorManger类用来控制传感器○ 如SensorManager.SENSOR_DELAY_NORMAL:设置采集频率
为正常频率,一般对实时性要求不高的应用适合使用这种频率。
■ Sensor用来描述具体的传感器名称○ 如Sensor.TYPE_GYROSCOPE:陀螺仪传感器○ 如Sensor.TYPE_ACCELEROMETER:加速度传感器
■ SensorEventListener用来监听传感器值的改变。
IMU
■ 开发Step1:获取传感器管理对象○ SensorManager mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);
■ 开发Step2:选择需要使用的传感器○ mSensor =mSensorManager.getDefaultSensor
(Sensor.TYPE_ACCELEROMETER);
IMU
■ 开发Step3:在onResume()方法注册监听器,以此来感知
该传感器数据
■ 开发Step4:onStop()方法中取消注册。
IMU
■ Step3:example
获得加速度计或者陀螺仪三轴数据之后:1.简单的操作可以将三轴数
据输出在工作台或手机界面进行显示。2.复杂的处理,比如在使用
三轴数据对行为动作进行感知(如步行的步数使用加速度计的数据来进行计算)
IMU简单应用
■ 界面示例:
■ 代码示例:附件sensor-code
■ 参考博客:博客1,博客2
触摸屏
■ 简介○ 触摸屏是如今基本所有智能手机具有的人机交互工具,我们
可以使用触摸屏来对智能手机进行操作,这里就介绍一下安卓如何来识别触屏手势。
■ Android开发接口API
○ MotionEvent对象是安卓对触摸屏事件的封装,我们可以将一次触屏的操作看成一个时序过程,那么MotionEvent对象
就是与用户触摸相关的时间序列。
○ 该时间序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指离开屏幕时结束。
触摸屏
■ MotionEvent(对应的动作常量)○ MotionEvent.ACTION_DOWN:当屏幕检测到第一个触点按下
之后就会触发到这个事件。
○ MotionEvent.ACTION_MOVE:当触点在屏幕上移动时触发,
触点在屏幕上停留也是会触发
○ MotionEvent.ACTION_UP:当触点松开时被触发。
■ MotionEvent(方法)○ getAction():返回动作类型
○ getX()/getY():获得事件发生时,触摸的中间区域的X/Y坐标,由这两个函数获得的X/Y值是相对坐标
触摸屏
■ MotionEvent(方法接上)
○ getSize():指压范围
○ getPressure(): 压力值,0-1之间,看情况,很可能始终返回1
,具体的级别由驱动和物理硬件决定的
○ getDownTime() :按下开始时间
○ getEventTime() : 事件结束时间
■ 开发指南
○ 基于以上时序的坐标、压力等数据,我们可以实现简单的长度以及方向计算,实现手势判断,比如滑动、点击屏幕等。应用:九宫格解锁等
此处仅简介用触摸屏做触屏手势的感知,更多开发细节(如多点触控等)可以参考官网,博客等资料。
音频
■ 音频开发基础概念(博客)○ 采样率(samplerate):采样就是把模拟信号数字化的过程,
不仅仅是音频需要采样,所有的模拟信号都需要通过采样转换为可以用0101来表示的数字信号
○ 量化精度(位宽):每一个红色的采样点,都需要用一个数值来表示大小,位数越多声音质量就越好。4/8/16/32 bit
○ 声道数(channels):可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。
○ 音频帧(frame):音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正弦波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际应用中,为了音频算法处理/传输的方便,一般取2.5ms~60ms为单位的数据量为一帧音频。
音频
■ Android提供了哪些音频开发相关的API?○ 音频采集: MediaRecoder,AudioRecord
○ 音频播放: SoundPool,MediaPlayer,AudioTrack
○ 音频编解码: MediaCodec
○ NDK API: OpenSL ES
■ Adndroid VoIP相关的开源应用有哪些 ?○ Android开源网络电话:sipdroid
○ 网页即时通信:WebRTC(可移植到安卓端)
音频
■ 音频开发难点○ 延时与卡顿敏感
○ 噪声抑制(Denoise)
○ 回声消除(AEC)
○ 静音检测(VAD)
○ 混音算法
■ 感知应用○ 声学定位
○ 超声波感知物体形状
○ 音频频谱分析进行身份识别
Android Camera2
■ 简介○ 在Google推出Android5.0时,Camera API版本升级到了API2 (android.
hardware. camera2),之前的API1(android. hardware. camera)被标为Deprecated。
○ API2相较于API1有很多特性,比如更先进的API结构、更完全的控制Camera、支持更多图像格式等,以下就简要介绍Camera2开发流程。
■ 基本架构○ App发送CaptureRequest,CameraDevice收到请求返回数据到对应的Surface
,预览数据一般到TextureView,拍照数据则在ImageReader中,整体就是一个请求相应过程,可想象为管道方式连接。
CaptureReque
stCameraMeta
Data
Previ
ew Sav
e
Camera
APP
Camera
Device
TextureView
ImageReader
Android Camera2
■ 使用流程○ 通过context.getSystemService(Context.CAMERA_
SERVICE)获取CameraManager;
○ 调用CameraManager.open()方法在回调中得到CameraDevice;
○ 通过CameraDevice.createCaptureSession()在回调中获取CameraCaptureSession;
○ 构建CaptureRequest, 有预览/拍照/录像三种模式可选;
○ 通过CameraCaptureSession发送CaptureSession,capture表示只发一次请求, setRepeatRequest表示不断发送请求;
○ 拍照数据可以在ImageReader.OnImageAvailableListener回调中获取,captureCallback中则可获取拍照实际的参数和Camera当前状态;
■ 更多细节请参考:○ GitHub
○ 博客
getSystemServ
ice
Start
CameraManag
er
CameraDevice
CreateCaptureSessi
on
open
ImageReaderSurfaceTexture
BuildCaptureReque
st
CaptureCallback
End
sendRequ
est
CapturesetRepeatRequest
Preview/Capture/Record