第Ⅰ部分 位置服务 3
第1章 Android位置服务简介 3
1.1 用于确定位置的方法 3
1.1.1 GPS提供者 4
1.1.2 网络提供者(Network Provider) 7
1.2 小结 9
第2章 确定设备当前位置 11
2.1 了解你的工具 12
2.1.1 LocationManager 12
2.1.2 Location Provider 12
2.1.3 Location 13
2.1.4 Criteria 13
2.1.5 LocationListener 14
2.2 设置Android清单 14
2.3 确定合适的位置提供者 14
2.3.1 GPS位置提供者 15
2.3.2 网络位置提供者 15
2.3.3 被动位置提供者 15
2.3.4 精确度与电池寿命 16
2.4 获取位置更新 16
2.4.1 使用LocationListener获取位置更新 17
2.4.2 使用广播Intent来获取位置更新 17
2.5 实现示例应用 17
2.5.1 实现LocationListener 17
2.5.2 获取LocationManager的句柄 19
2.5.3 请求位置更新 22
2.5.4 自行清理 23
2.5.5 启动位置设置活动 24
2.6 小结 25
第3章 跟踪设备的移动 27
3.1 收集位置数据 28
3.1.1 使用广播接收器获取位置更新 28
3.1.2 使用服务 33
3.2 查看跟踪数据 35
3.3 过滤位置数据 40
3.4 持续的位置跟踪和电池寿命 43
3.4.1 减少位置更新频率 43
3.4.2 限制位置提供者 44
3.5 小结 44
第4章 接近警报 45
4.1 应用结构 45
4.1.1 地理编码 46
4.1.2 设置接近警报 50
4.1.3 对接近警报做出响应 52
4.2 接近警报的局限性 55
4.2.1 电池寿命 55
4.2.2 权限 55
4.3 更有效的接近警报 55
4.4 小结 60
第Ⅱ部分 推断来自物理传感器的信息 63
第5章 物理传感器概述 63
5.1 定义 64
5.2 Android传感器API 65
5.2.1 SensorManager 66
5.2.2 Sensor 66
5.2.3 传感器速率 66
5.2.4 传感器范围和分辨率 67
5.2.5 SensorEventListener 68
5.2.6 SensorEvent 68
5.2.7 Sensor List 69
5.3 感知环境 81
5.3.1 Sensor.TYPE_LIGHT 81
5.3.2 Sensor.TYPE_PROXIMITY 82
5.3.3 Sensor.TYPE_PRESSURE 83
5.3.4 Sensor.TYPE_RELATIVE_HUMIDITY 86
5.3.5 Sensor.TYPE_AMBIENT_TEMPERATURE 86
5.3.6 Sensor.TYPE_TEMPERATURE 86
5.4 感知设备方向和移动 87
5.4.1 坐标系 87
5.4.2 全局坐标系 87
5.4.3 设备坐标系 88
5.4.4 角度 88
5.4.5 Sensor.TYPE_ACCELEROME-TER、.TYPE_GRAVITY以及.TYPE_LINEAR_ACCELERATION 88
5.4.6 Sensor.TYPE_GYROSCOPE 90
5.4.7 Sensor.TYPE_MAGNETIC_FIELD 91
5.4.8 Sensor.TYPE_ROTATION_VECTOR 93
5.4.9 SensorManager.getOrientation() 93
5.4.10 SensorManager.getInclination() 96
5.4.11 传感器融合方案 97
5.5 小结 97
第6章 误差及传感器信号处理 99
6.1 定义 99
6.1.1 准确度和精确度 100
6.1.2 误差类型 101
6.1.3 修正误差的技术 102
6.2 滤波器 103
6.2.1 低通滤波 103
6.2.2 高通滤波 107
6.2.3 带通滤波 109
6.2.4 Kalman滤波器的介绍 110
6.3 使用传感器融合技术更好地确定方向 111
6.4 小结 114
第7章 确定设备方向 117
7.1 预览示例应用 117
7.2 确定设备方向 118
7.2.1 重力传感器 118
7.2.2 加速计和磁强计 119
7.2.3 重力传感器和磁强计 120
7.2.4 旋转矢量 120
7.2.5 详细实现 120
7.3 NorthFinder 139
7.4 小结 142
第8章 检测运动 143
8.1 加速度数据 144
8.1.1 加速计数据 144
8.1.2 线性加速度传感器数据 146
8.1.3 设备运动时的数据 146
8.1.4 总加速度 148
8.2 代码实现 148
8.2.1 DetermineMovementActivity 148
8.2.2 AccelerationEventListener 152
8.3 小结 154
第9章 感知环境 155
9.1 气压计与GPS 156
9.2 示例应用概述 156
9.2.1 详细实现 157
9.2.2 相对海拔高度 172
9.3 小结 181
第10章 Android开放外设 183
10.1 概述AOA的历史 183
10.1.1 USB主机与USB外设 184
10.1.2 电源要求 184
10.1.3 支持的Android设备 184
10.2 Android开发包(ADK) 185
10 2.1 硬件组件 187
10.2.2 软件组件 188
10.3 AOA传感器与设备本地传感器 189
10.4 传感器之外的AOA 190
10.5 AOA的局限性 190
10.6 AOA和温度感知 190
10.7 将Android外设放至消费者市场 209
10.8 小结 210
第Ⅲ部分 感知增强的、模式丰富的外部世界 215
第11章 近场通信(NFC) 215
11.1 RFID 215
11.2 NFC 218
11.2.1 NDEF数据格式 218
11.2.2 如何以及从哪里购买NFC标签 220
11.2.3 NFC的优点和缺点 222
11.3 构建一个库存跟踪系统 225
11.3.1 场景 225
11.3.2 NFC库存演示应用 225
11.3.3 在设置中启用NFC 225
11.3.4 通过应用调试标签 226
11.4 Android API 227
11.4.1 AndroidManifest.xml文件 227
11.4.2 主Activity类 231
11.4.3 整合 245
11.5 未来的设想 246
11.5.1 NFC N-Mark 246
11.5.2 点对点NFC共享 246
11.5.3 点对点Android API 247
11.6 NFC的新应用 248
11.7 小结 249
第12章 使用摄像头 251
12.1 使用摄像头Activity 251
12.1.1 使用Activity控制摄像头 252
12.1.2 控制摄像头 256
12.2 创建一个简单的条形码读取器 262
12.2.1 了解条形码 263
12.2.2 自动对焦 267
12.2.3 检测条形码 271
12.3 小结 274
第13章 图像处理技术 275
13.1 图像处理程序的结构 275
13.1.1 图像处理管道 275
13.1.2 常用的图像处理操作 276
13.1.3 JJIL 278
13.1.4 JJIL与检测Android logo 285
13.2 人脸探测 293
13.3 图像处理资源 293
13.4 小结 294
第14章 使用麦克风 295
14.1 介绍Android声控开关 295
14.2 使用MediaRecorder分析最大振幅 296
14.2.1 录制最大振幅 297
14.2.2 异步音频录制 302
14.3 实现声控开关 304
14.4 分析原始音频 306
14.4.1 设置音频输入参数 306
14.4.2 准备AudioRecord 308
14.4.3 录制音频 308
14.4.4 使用OnRecordPosition-UpdateListener 309
14.5 使用巨响检测 314
14.6 使用一致的频率检测 316
14.6.1 预测频率 316
14.6.2 实现乐音声控开关 318
14.7 小结 321
第Ⅳ部分 与Android对话 325
第15章 设计带语音功能的应用 325
15.1 了解你的工具 326
15.2 用户界面屏幕流 328
15.3 语音操作类型 329
15.4 语音用户界面设计 330
15.4.1 决定适合语音操作的任务 330
15.4.2 设计应用和用户所说的内容 331
15.4.3 设计完成之后 337
15.5 测试设计 337
15.6 小结 338
15.7 参考文献 338
第16章 使用语音识别和文本转语音API 339
16.1 文本转语音 339
16.1.1 初始化 340
16.1.2 朗读 354
16.2 语音识别 365
16.2.1 初始化 366
16.2.2 使用RecognizerIntent 370
16.2.3 使用SpeechRecognizer的直接语音识别 392
16.3 小结 394
第17章 匹配所说的话 395
17.1 语音命令的各个部分 395
17.2 单词识别 397
17.3 匹配持久化存储中的命令单词 405
17.3.1 SQLite全文本搜索 406
17.3.2 使用Lucene进行单词搜索 414
17.4 多部分命令 419
17.4.1 忽略潜在的冲突 420
17.4.2 考虑顺序 421
17.5 使用语法 426
17.6 小结 426
第18章 执行语音操作 427
18.1 食物对话VUI设计 427
18.2 定义和执行语音操作 428
18.3 执行VoiceActionCommand 434
18.4 为语音操作实现AlertDialog 437
18.5 实现多轮次语音操作 442
18.5.1 实现多轮次AddFood 442
18.5.2 实现多轮次RemoveFood 445
18.6 做出最佳猜测 448
18.6.1 放宽匹配的严格度 448
18.6.2 放宽命令之间的严格度 450
18.6.3 做出有根据的猜测 451
18.7 在识别失败时做出响应 453
18.7.1 确定不是命令 455
18.7.2 确定不准确的识别 456
18.7.3 没有理解 456
18.8 小结 456
第19章 实现语音激活 457
19.1 实现语音激活 458
19.1.1 启动语音识别 458
19.1.2 在Activity中实现语音激活 461
19.1.3 使用移动检测激活语音识别 465
19.1.4 使用麦克风激活语音识别 467
19.1.5 使用持续的语音识别激活语音识别 469
19.1.6 使用NFC激活语音识别 473
19.2 实现持久的语音激活 475
19.3 小结 480