第11章 Android特色开发——基于位置的服务
本章中,将要学习一些全新的Android技术,这些技术有别于传统的PC或Web领域的应用技术,是只有在移动设备上才能实现的。
基于位置的服务(Location Based Service)。由于移动设备相比于电脑可以随身携带,我们通过地理定位的技术就可以随时得知自己所在的位置,从而围绕这一点开发出很多有意思的应用。
11.1 基于位置的服务简介
基于位置的服务简称LBS,其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置,而这种定位技术早在很多年前就已经出现了。
在过去移动设备的功能极其有限,即使定位到了设备所在的位置,也就仅仅只是定位到了而已,我们并不能在位置的基础上进行一些其他的操作。而现在就大大不同了,有了Android系统作为载体,可以利用定位出的位置进行许多丰富多彩的操作。比如说天气预报程序可以根据用户所在的位置自动选择城市,发微博的时候我们可以向朋友们晒一下自己在哪里,不认识路的时候随时打开地图就可以查询路线,等等。
首先要清楚,基于位置的服务所围绕的核心就是要先确定出用户所在的位置。
通常有两种技术方式可以实现,一种是通过GPS定位,一种是通过网络定位:
- GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星交互来获取当前的经纬度信息,这种定位方式精确度非常高,但缺点是只能在室外使用,室内基本无法接收到卫星的信号。
- 网络定位的工作原理是根据手机当前网络附近的三个基站进行测速,以此计算出手机和每个基站之间的距离,再通过三角定位确定出一个大概的位置,这种定位方式精确度一般,但优点是在室内室外都可以使用。
Android对这两种定位方式都提供了相应的API支持,但是由于一些特殊原因,Google的网络服务在中国不可访问,从而导致网络定位方式的API失效。而GPS定位虽然不需要网络,但是必须要在室外才可以使用,因此你在室内开发的时候很有可能会遇到不管使用哪种定位方式都无法成功定位的情况。
基于以上原因,本书中不再讲解Android原生定位API的用法了,而是使用一些国内第三方公司的SDK。目前国内在这一领域做得比较好的一个是百度,一个是高德,本章我们就来学习一下百度在LBS方面提供的丰富多彩的功能。
11.2 申请成为开发者
下面内容与书中记录的不一样了,书中的方式我注册不了...现在记录自己是如何申请成为百度开发者的流程:
要想在自己的应用程序里使用百度的LBS功能,你得拥有一个百度账号才能进行申请。然后,登录网住:登录百度账号
填入真实信息,进行邮箱验证等,注册的账号:
结果在进行人脸识别认证的时候,我的始终无法识别。最后,申请了高德开发者,步骤如下:
1.网址:首页 | 高德控制台
2.进行认证,支付宝、邮箱就可以了:
所以,以后Demo 书上是百度,我用的是高德了。
首先,创建新应用:
其次,新应用旁边有一个添加按钮,点击添加:
这个发布版安全码SHA1,开发模式(debug)和发布模式(release)下的 SHA1 值是不同的,发布 apk时 需要根据发布apk对应的keystore重新配置Key,获取发布模式下的SHA1的方法(可点击如何获取,学习获取步骤),通过Android Studio获取测试版SHA1:
1、打开Android Studio的Terminal工具。
2、输入命令:keytool -v -list -keystore keystore文件路径。
3、输入Keystore密码。
其中,91:16:04:30:C0:8B:6E:53:92:47:57:E6:FB:10:EF:08:1B:73:E6:3E就是所需的SHA1指纹了,当然你的Android Studio中显示的指纹和我的肯定是不一样的。
另外需要注意,目前我们使用的是debug.keystore文件所生成的指纹,这是Android自动生成的一个用于测试的签名文件。而当你的应用程序发布时还需要创建一个正式的签名文件,如果要得到它的指纹,可以在cmd中输入如下命令:
keytool -list -v -keystore <签名文件路径>
然后输入正确的密码就可以了。创建签名文件的方法我们将在第15章中学习。
现在得到的这个SHA1指纹实际上是一个开发版的SHA1指纹,不过因为暂时我们还没有一个发布版的SHA1指纹,因此这两个值都填成一样的就可以了。
上面这句话是个大坑!如果SHA1的发布版/测试版值都填入一样的,在最后很有可能出现:坐标一直为4.9E-324(这是导致定位坐标这样的原因之一,我之后在测试中,也改了不少。)
上面的代码,与原书不一致,都是经过查询网上资料改动过的,参考博客连接:
- 包名不一致(我的不是这个原因)https://www.cnblogs.com/hoyong/articles/11918642.html
- 室内用不了GPS....(我用的WIFI/移动4G)
- 网络不好,联网失败(我的网非常好,所以不是这个原因)
- Android的模拟器是不能定位的,所以要使用真机(我的不是这个原因,但是这个确实是真的,在我排查全部bug后,手机上测试OK,到Android的模拟器上运行,为上图:坐标一直为4.9E-324,不显示定位方式)
- 权限错误/so库加载错误(我的不是这个原因)百度定位中出现4.9E-324问题的原因和解决办法 - 简书
然而,在是上面3中的博客里,最后一条就是SHA1指纹发布版和测试版不能一样!!!我测试了,对我来说是正确的解决办法。
下面,记录一下如何申请并找到SHA1指纹发布版步骤:
- 找到apk签名路径,可通过AS中build-generate signed bundle/apk -apk 进入如图界面:
- 检查一下该目录(E:\androidKey)中是否存在zhouzhou.jks,没有的话,查看文件是否被隐藏了:
其中key store path 为签名路径。
- 操作和获取开发版SHA1 基本一致,只需将debug.keystore换成签名路径即可,如图:
- 最后,将在开发平台更换发布版SHA1重新提交。注:项目最好clean一下。
下面开始,继续记录书上的内容,
最后还剩下一个包名选项,虽然目前我们的应用程序还不存在,但可以先将包名预定下来,比如就叫com.zhouzhou. lbstest,这样所有的内容就都填写完整了,如图为百度地图开放平台创建的应用信息:
(注:第二天百度的人脸识别认证我整成功了,为了和书上保持一致,我接下来选择用百度地图开放平台做Demo。事实上,高德平台步骤也差不多,以后有机会会尝试的)
接下来点击提交,应用就应该创建成功了,如图:
其中,i6VD2fHKM3msMfZtIOXAhFSzDiYGFIwL(访问应用(AK))就是申请到的API Key,有了它就可以进行后续的LBS开发工作了,那么我们马上开始吧。
11.3 使用百度定位
新建一个LBSTest项目,包名应该就会自动被命名为com.zhouzhou.lbstest。另外需要注意,本章中所写的代码建议都在手机上运行,虽然模拟器中也提供了模拟地理位置的功能,但在手机上可以得到真实的位置数据,你的感受会更加深刻。
11.3.1 准备LBS SDK
在开始编码之前,我们还需要先将百度LBS开放平台的SDK准备好,目前百度地图Android地图SDK境内服务对非商业目的使用的开发者不收取任何费用,开发者可自行下载:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download放心使用。
本章中,我们会用到基础地图和定位功能这两个SDK,将它们勾选上,然后点击“开发包”下载按钮即可,如图:
下载完成后对该压缩包解压,其中会有一个libs目录,这里面的内容就是我们所需要的一切了,如图:
libs目录下的内容又分为两部分,BaiduLBS_Android.jar这个文件是Java层要使用到的,其他子目录下的so文件是Native层要用到的。so文件是用C/C++语言进行编写,然后再用NDK编译出来的。当然这里我们并不需要去编写C/C++的代码,因为百度都已经做好了封装,但是我们需要将libs目录下的每一个文件都放置到正确的位置。
首先,观察一下当前的项目结构,会发现app模块下面有一个libs目录,这里就是用来存放所有的Jar包的,我们将BaiduLBS_Android.jar复制到这里,如图:
接下来展开src/main目录,右击该目录→New→Directory,再创建一个名为jniLibs的目录,这里就是专门用来存放so文件的,然后把压缩包里的其他所有目录直接复制到这里,如图:
另外,虽然所有新创建的项目中,app/build.gradle文件都会默认配置以下这段声明(不整这个也行,上面BaiduLBS_Android.jar复制之后,直接Add As Library...即可,dependencies中会被自动添加一行implementation files('libs\\BaiduLBS_Android.jar')
,注意,Add As Library...
和下面的implementation fileTree(include: ['*.jar'], dir: 'libs')
方式要二选一,不要都写上,会报冲突!!!):
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
}
这表示会将libs目录下所有以.jar结尾的文件添加到当前项目的引用中。(但是由于我们是直接将Jar包复制到libs目录下的,并没有修改gradle文件,因此不会弹出我们平时熟悉的Sync Now提示。这个时候必须手动点击一下AndroidStudio顶部工具栏中的Sync按钮,不然项目将无法引用到Jar包中提供的任何接口。)
点击Sync按钮之后,libs目录下的jar文件就会多出一个向右的箭头,这就表示项目已经能引用到这些Jar包了,如图: