Android开发10:传感器?及地图相关应用,android传感器
前言
啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了。(博客中有很多照片上有代码,代码文本较小,各位可按下Ctrl和前滚轮放大后再看~)
一起进入我们今天的相关内容~这次我们将一起学习使用 android 手机不同的传感器,包括磁强计、加速度传感器等。学会使用 android 位置服务获得经纬度信息。学会使用百度地图基础API进行地图应用的开发。
基础知识
一、传感器简介
手机中内置的传感器是一种微型的物理设备,它能够探测、感受到外界的信号,并按一定规律转换成我们所需要的信息。Android 手机通常都会支持多种类型的传感器,如光照传感器、加速度传感器、地磁传感器、压力传感器、温度传感器等。
当然,Android 系统只是负责将这些传感器所输出的信息传递给我们,至于具体如何去利用这些信息就要充分发挥开发者的想象力了。
二、Android传感器框架
Android SDK为我们提供了ASF,可以用来访问当前Android设备内置的传感器。ASF提供了很多类和接口,帮助我们完成各种与传感器有关的任务。例如:
1)确定当前Android设备内置了哪些传感器。
2)确定某一个传感器的技术指标。
3)获取传感器传回来的数据,以及定义传感器回传数据的精度。
4)注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。
ASF允许我们访问很多传感器类型,这些传感器有一些是基于硬件的传感器,还有一些是基于软件的传感器。基于硬件的传感器就是直接以芯片形式嵌入到Android设备中,这些传感器直接从外部环境获取数据。基于软件的传感器并不是实际的硬件芯片,基于软件的传感器传回的数据本质上也来自于基于硬件的传感器,只是这些数据通常会经过二次加工。所以基于软件的传感器也可以称为虚拟(virtual)传感器或合成(synthetic)传感器。
Android对每个设备的传感器都进行了抽象,其中SensorManger类用来控制传感器,Sensor用来描述具体的传感器,SensorEventListener用来监听传感器值的改变。
(1)SensorManager类
用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
(2)Sensor类
Sensor类为我们提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。例如所有传感器的TYPE类型如下:
序号 | 传感器 | Sensor类中定义的TYPE常量 |
---|---|---|
1 | 加速度传感器 | TYPE_ACCELEROMETER |
2 | 温度传感器 | TYPE_AMBIENT_TEMPERATURE |
3 | 陀螺仪传感器 | TYPE_GYROSCOPE |
4 | 光线传感器 | TYPE_LIGHT |
5 | 磁场传感器 | TYPE_MAGNETIC_FIELD |
6 | 压力传感器 | TYPE_PRESSURE |
7 | 临近传感器 | TYPE_PROXIMITY |
8 | 湿度传感器 | TYPE_RELATIVE_HUMIDITY |
9 | 方向传感器 | TYPE_ORIENTATION |
10 | 重力传感器 | TYPE_GRAVITY |
11 | 线性加速传感器 | TYPE_LINEAR_ACCELERATION |
12 | 旋转向量传感器 | TYPE_ROTATION_VECTOR |
注意:1-8是硬件传感器,9是软件传感器,其中方向传感器的数据来自重力和磁场传感器,10-12是硬件或软件传感器。
(3)SensorEvent类
系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
(4)SensorEventListener接口
该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。
/**
* 传感器精度变化时回调
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/**
* 传感器数据变化时回调
*/
@Override
public void onSensorChanged(SensorEvent event) {
}
到了这里,我们就可以进行传感器开发工作了。
实验内容
本次实验主要是涉及传感器及地图相关应?,实现简单的地图功能。
实现最终结果实现效果如图所示:
实验效果图
主要分为以下三部分
a) 调用百度地图SDK实现地图的展示以及交互,其中包括左下角的按钮要求实现的功能如下:
i. 当按钮处于状态时:如果GPS位置有更新,那么更新用户当前所在位置,并使得当前位置的箭头图标一直保持在屏幕中心。
ii. 按钮处于 状态时,更新当前位置的箭头的时候不移动地图。
iii. 点击按钮可以切换这两种状态,当按钮进入状态的时候,使得表示当前位置的箭头位于屏幕中央。
iv. 如果按钮处于 的状态手动平移百度地图的时候,地图进行平移并且按钮变为
状态。
b) 获取当前所在位置与方向,并在百度地图上显示出来,如图中黑色箭头所示,箭头中心位置为定位结果,箭头方向为手机的朝向。
c) 实现简单摇一摇功能,当晃动手机的时候作出相应的响应。
实验过程
1. 首先要申请百度的开发者密钥(申请密钥 Android SDK http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key),申请地址:http://lbsyun.baidu.com/apiconsole/key
首先,在申请AK的表单中选择AndroidSDK,发现还要输入发布版SHA1以及报名这两个信息。
其中,应用包名为build.gradle里的ApplicationId,并且保证这个ApplicationId与Manifest里的package字段名是一样的(如下图所示)。
Manifest 里的应用包名
build.gradle 里的应用包名
发布版SHA1为了方便直接使用Android默认的debug.keystore里的SHA1,进入用户文件夹(Windows为C:\Users\username,Linux为/home/username,Mac为/Users/username)后,输入如下命令即可看到SHA1值(输入密钥库口令里直接回车)
证书指纹里的SHA1值为在申请应用AK的时候需要填写的。
点击确定后即可得到一个Android SDK的应用AK:
成功申请应用 AK
下载百度地图SDK的依赖库<BaiduLBS_AndroidSDK_Lib.zip>,按照百度地图SDK配置环境与发布 (配置环境及发布 Android SDK :http://lbsyun.baidu.com/index.php?title=androidsdk/guide/buildproject) 把依赖库放到相应的文件夹并添加到工程里,并按照HelloBaiduMap (Hello BaiduMap:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap)中的步骤,在AndroidManifest.xml文件里添加权限以及应用AK。
特别的,由于Android API 23以上需要动态申请权限,这里使用一个Github上的开源工具RxAndroid( https://github.com/ReactiveX/RxAndroid)进行处理,也可以自己根据Android官方的API进行或者其他的工具。首先需要在build.gradle中加入需要的依赖项:
然后新建一个启动的Activity,在这个单独的Activity的onCreate方法里检查是否获取需要的权限,如果没有则直接退出程序,实现代码参考如下: