这次我们试水高德LBS开放平台,

那么,什么是LBS?

基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息,在地理信息系统平台的支持下,为用户提供相应服务的一种增值业务。

简介下高德LBS开放平台:

Android 定位SDK最新版本为V2.8.0,包含全球定位功能。
Android 定位 SDK 是一套简单的LBS服务定位接口,您可以使用这套定位API获取定位结果、逆地理编码(地址文字描述)、以及地理围栏功能。

配置工程,申请Key:

http://lbs.amap.com/,注册账号并填写开发者信息,通过SHA1和包名获取key。

Key名称按命名规范来,

规范命名会让数据统计和数据分析更准确

建议命名方式: [应用名 + 应用场景]

如:神州专车-司机端;神州专车-Demo等

Package对应你应用的包名:

打开Android 应用工程的 AndroidManifest.xml配置文件,package 属性所对应的内容为应用包名。

SHA1的查看:

获取SHA1值

首先,绝大多数App在调试时使用的签名文件(debug keystore)和最终App发布使用的签名文件(自定义的keystore)是不同的,不同签名文件的SHA1值也是不同的。下面提供几种获取SHA1值的方式:

通过Eclipse编译器获取SHA1

使用 adt 22 以上版本,可以在 eclipse 中直接查看。

Windows:依次在 eclipse 中打开 Window -> Preferances -> Android -> Build。

Mac:依次在 eclipse 中打开 Eclipse/ADT->Preferances -> Android -> Build。

在弹出的 Build 对话框中 “SHA1 fingerprint” 中的值即为 Android 签名证书的 Sha1 值,如下图所示:

通过Android Studio编译器获取SHA1

第一步、打开Android Studio的Terminal工具<br/>

第二步、输入命令:keytool -v -list -keystore keystore文件路径<br/>

第三步、输入Keystore密码

使用 keytool(jdk自带工具)获取SHA1

1.运行进入控制台。

2.在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹。(我的路径为:C:\Users\car\.android\debug.keystore,仅供参考;最好的方法是全局搜索)

3.继续在控制台输入命令。

debug.keystore:命令为:keytool -list -v -keystore debug.keystore

自定义的 keystore:命令为:keytool -list -v -keystore apk的keystore

如下所示:

提示输入密钥库密码,编译器提供的debug keystore默认密码是 android,自定义签名文件的密码请自行填写。输入密钥后回车(如果没设置密码,可直接回车),此时可在控制台显示的信息中获取 SHA1 值,如下图所示:

说明:keystore 文件为 Android 签名证书文件。

Android Studio 配置工程
1、新建一个 Empty Activity 的应用项目,您可参考 入门指南<创建工程>章节创建一个 Android 工程。

2、将下载的定位SDK的jar包复制到libs目录下,如果有老版本定位jar包在其中,请删除。如图所示:

添加高德 Key

为了保证高德 Android SDK 的功能正常使用,您需要申请高德 Key 并且配置到项目中。

项目的 “AndroidManifest.xml” 文件中,添加如下代码:

<applicationandroid:icon="@drawable/icon"android:label="@string/app_name" ><meta-dataandroid:name="com.amap.api.v2.apikey"android:value="请输入您的用户Key"/>……
</application>

然后添加联网等相应权限,见demo。

    <!--获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /><!-- 请求网络 --><uses-permission android:name="android.permission.INTERNET" /><!-- 不是SDK需要的权限,是示例中的后台唤醒定位需要的权限 --><uses-permission android:name="android.permission.WAKE_LOCK" /><!-- 需要运行时注册的权限 --><!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--读取缓存数据--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!--用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 更改设置 --><uses-permission android:name="android.permission.WRITE_SETTINGS" />

代码混淆

在生成 apk 进行代码混淆时进行如下配置(如果报出 warning,在报出 warning 的包加入类似的语句:-dontwarn 包名)

    3D 地图-keep   class com.amap.api.mapcore.**{*;} -keep   class com.amap.api.maps.**{*;} -keep   class com.autonavi.amap.mapcore.*{*;} 定位-keep class com.amap.api.location.**{*;}-keep class com.amap.api.fence.**{*;}-keep class com.autonavi.aps.amapapi.model.**{*;}搜索-keep   class com.amap.api.services.**{*;}2D地图-keep class com.amap.api.maps2d.**{*;}-keep class com.amap.api.mapcore2d.**{*;}导航-keep class com.amap.api.navi.**{*;}-keep class com.autonavi.**{*;}

接下来是自由开发时间~

获取定位数据

获取定位数据之前,需要在 AndroidManifest.xml 文件中进行权限设置,确保定位功能可以正常使用。

第 1 步,配置AndroidManifest.xml

首先,声明Service组件

请在application标签中声明service组件,每个app拥有自己单独的定位service。

1
<service android:name="com.amap.api.location.APSService"></service>

然后,声明权限

Android 6.0及以上系统可以参考Android 6.0权限说明章节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

最后,设置高德Key

在application标签中加入:

1
2
3
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key      
             
</meta-data>

第 2 步,初始化定位

请在主线程中声明AMapLocationClient类对象,需要传Context类型的参数。推荐用getApplicationConext()方法获取全进程有效的context。

1
2
3
4
5
6
7
8
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener();
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);

第 3 步,配置参数并启动定位

创建AMapLocationClientOption对象

AMapLocationClientOption对象用来设置发起定位的模式和相关参数。

1
2
3
4
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();

选择定位模式

高德定位服务包含GPS和网络定位(Wi-Fi和基站定位)两种能力。定位SDK将GPS、网络定位能力进行了封装,以三种定位模式对外开放,SDK默认选择使用高精度定位模式。

高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,当通过GPS定位时不会返回地址描述信息。

1
2
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);

低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);

1
2
//设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。
mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);

仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,且不会返回地址描述信息。

1
2
//设置定位模式为AMapLocationMode.Device_Sensors,仅设备模式。
mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);

设置单次定位

如果您需要使用单次定位,需要进行如下设置:

1
2
3
4
5
6
7
8
9
//获取一次定位结果:
//该方法默认为false。
mLocationOption.setOnceLocation(true);
//获取最近3s内精度最高的一次定位结果:
//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
mLocationOption.setOnceLocationLatest(true);
}

自定义连续定位

SDK默认采用连续定位模式,时间间隔2000ms。如果您需要自定义调用间隔:

1
2
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000);

其他参数

设置定位同时是否需要返回地址描述。

1
2
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);

设置是否强制刷新WIFI,默认为强制刷新。每次定位主动刷新WIFI模块会提升WIFI定位精度,但相应的会多付出一些电量消耗。

1
2
//设置是否强制刷新WIFI,默认为true,强制刷新。
mLocationOption.setWifiActiveScan(false);

设置是否允许模拟软件Mock位置结果,多为模拟GPS定位结果,默认为false,不允许模拟位置。

1
2
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);

启动定位

1
2
3
4
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();

第 4 步,获取定位结果

AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。

实现监听器

1
2
3
4
5
6
7
8
//可以通过类implement方式实现AMapLocationListener接口,也可以通过创造接口类对象的方法实现
//以下为后者的举例:
AMapLocationListener mAMapLocationListener = new AMapLocationListener(){
@Override
public void onLocationChanged(AMapLocation amapLocation) {
     
  }
}

之后在监听器的回调方法内解析AMapLocation对象。

解析AMapLocation对象

首先,可以判断AMapLocation对象不为空,当定位错误码类型为0时定位成功。

1
2
3
4
5
6
7
8
9
10
if (amapLocation != null) {
    if (amapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
    }else {
    //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
    Log.e("AmapError","location Error, ErrCode:"
        + amapLocation.getErrorCode() + ", errInfo:"
        + amapLocation.getErrorInfo());
    }
}

当定位成功时,可在如上判断中解析amapLocation对象的具体字段,参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);

最后一步,停止定位

停止定位

1
mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁

销毁定位客户端

销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。

1
mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。

注意事项

● 目前手机设备在长时间黑屏或锁屏时CPU会休眠,这导致定位SDK不能正常进行位置更新。若您有锁屏状态下获取位置的需求,您可以应用alarmManager实现1个可叫醒CPU的Timer,定时请求定位。

● 使用定位SDK务必要注册GPS和网络的使用权限。

● 在使用定位SDK时,请尽量保证网络畅通,如获取网络定位,地址信息等都需要设备可以正常接入网络。

● 定位SDK在国内返回高德类型坐标,海外定位将返回GPS坐标。

● 仅设备定位(通过GPS定位)是设备本地定位行为,是不返回地址信息的,地址信息在网络定位时会返回。

最后附上核心源代码:

package gdtest.com.quan.car.mygdtest;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;import java.text.SimpleDateFormat;
import java.util.Date;/*权兴权意-20160905*/public class MainActivity extends Activity {private static final String TAG = "MainActivity";//初始化定位//请在主线程中声明AMapLocationClient类对象,需要传Context类型的参数。// 推荐用getApplicationConext()方法获取全进程有效的context。//声明AMapLocationClient类对象public AMapLocationClient mLocationClient = null;//声明定位回调监听器public AMapLocationListener mLocationListener = new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {//获取定位结果//AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//可在其中解析amapLocation获取相应内容。Log.d(TAG, "onLocationChanged: " + aMapLocation.getCountry() + aMapLocation.getProvince()+ aMapLocation.getCity() + aMapLocation.getDistrict() + aMapLocation.getStreet() + aMapLocation.getStreetNum());Toast.makeText(getApplicationContext(),"onLocationChanged: " + aMapLocation.getCountry() + aMapLocation.getProvince()+ aMapLocation.getCity() + aMapLocation.getDistrict() + aMapLocation.getStreet() + aMapLocation.getStreetNum(),Toast.LENGTH_SHORT).show();//获取定位时间SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(aMapLocation.getTime());Log.d(TAG, "onLocationChanged: " + df.format(date));Toast.makeText(getApplicationContext(),"onLocationChanged: " + df.format(date),Toast.LENGTH_SHORT).show();}else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError","location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}};//配置参数并启动定位//声明AMapLocationClientOption对象public AMapLocationClientOption mLocationOption = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toast.makeText(this,"onCreate",Toast.LENGTH_SHORT).show();Log.d(TAG, "onCreate");//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位回调监听mLocationClient.setLocationListener(mLocationListener);//初始化AMapLocationClientOption对象mLocationOption = new AMapLocationClientOption();//高德定位服务包含GPS和网络定位(Wi-Fi和基站定位)两种能力。//定位SDK将GPS、网络定位能力进行了封装,以三种定位模式对外开放,SDK默认选择使用高精度定位模式。//高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,当通过GPS定位时不会返回地址描述信息。mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//自定义连续定位//SDK默认采用连续定位模式,时间间隔2000ms。如果您需要自定义调用间隔://设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。mLocationOption.setInterval(5000);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}@Overrideprotected void onDestroy() {mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。super.onDestroy();}
}

文末小彩蛋:

AndroidStudio 修改 Master Password

Android studio生成签名包的时候 要求输入 MasterPassword,结果忘了密码。 可以通过reset操作重置密码。 
也可以进入 Appearance&Behavior ->SystemSetting->Passwords修改。

在cmd(命令提示符)下进行复制粘贴操作

右键命令提示符窗口的标题栏,选择属性。选择“编辑选项”里的“快速编辑模式”,并确定之;

复制:进行如上设置后,鼠标左键按下选定一个区域,再右键在窗口内单击(或者按一下回车键),就将选定区文字复制下了。
粘贴:在未选定文字的状态下,窗口内单击右键,就将剪贴板的文字内容粘贴到窗口光标处了。

试水高德LBS开放平台-HelloWord(文末小彩蛋)相关推荐

  1. Android中的状态保存-SharedPreferences和Bundle(文末小彩蛋)

    SharedPreferences 是使用键值对的方式来存储数据的.也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来.而且Shared ...

  2. 高德LBS开放平台携手SAE 抱团背后开发者受益

    北京时间1月9日消息,国内地图导航服务提供商高德旗下LBS开放平台日前正式宣布与新浪云计算SAE(Sina App Engine,简称SAE)达成战略合作. 合作达成之后,原SAE用户在开发中将能够更 ...

  3. 科普:什么是ChatGPT?(文末有彩蛋)

    科普:什么是ChatGPT?(文末有彩蛋) ChatGPT介绍 ChatGPT是OpenAI开发的一个大型预训练语言模型.它是GPT-3模型的变体,GPT-3经过训练,可以在对话中生成类似人类的文本响 ...

  4. 你们猜猜,哪个省的女生最爱丰胸?文末有彩蛋!

    本文图文来自好奇博士,数据来自天猫官方 来来来,彩蛋来了,文末送书10本,非常感谢北大出版社的大力支持.都是不错的Python好书,大家可以试一下手气哦! <Python数据分析全流程实操指南& ...

  5. 火遍全网的chatGPT(文末有彩蛋)

    最近网上非常火爆的CHATGPT,它是OpenAI开发的一款开源的自然语言处理 (NLP) 模型,用于实现对话生成和语言模型预测.CHATGPT 模型基于 GPT-3 (Generative Pret ...

  6. 说说每月至少一次的那点事,文末有彩蛋!

    老读者知道的,每个月都会有那么一次,图灵教育出版社的小姐姐会赞助一些 IT 优质书籍,我都会拿来反馈给读者,这个月也一样.无套路送书 9 本,以下 3 种书籍各自  3 本. 不用你看一堆公众号二维码 ...

  7. 骨髓基质在正常和白血病个体中的细胞图谱|Cell最新(文末有彩蛋)

    文章解读:Tiger 文章校对:生信宝典 研究背景 基质细胞是几乎每个器官中都存在的定义不明确的非实质成分,在器官发育,体内平衡和修复中起关键作用.对骨髓基质的研究已经确定了干细胞生态位中的基质细胞的 ...

  8. 信息编码 — 进大厂必备底层能力之一(文末有彩蛋)

    3月18日 20:00 由C站白月光,20年码龄的技术VC大咖为大家带来 信息编码 - 进大厂必备底层能力之一,以下为直播文字实录: 今晚主题是一个偏底层的话题:[计算机信息编码]. 为什么选择这个话 ...

  9. 开启sketchup超速云渲染模式,文末附彩蛋!

    2019年3月,渲云效果图客户端开放支持sketchup软件--一款专门配合CG工作人员设计过程研发的3D模型设计软件,可以创作出草稿.线稿.透视.渲染等不同显示模式,可将自己的手绘风格融入到模型表现 ...

  10. 新年伊始,我们共赴数据盛宴,与未来对话!​(文末有彩蛋)

    2018年1月3日,第四届清华大学大数据人才新春交流会如期而至.本届交流会继续秉承"跨界融合.谋求共赢"的理念,邀请了数据科学研究院管理委员会及教育指导委员会的代表.大数据培养项目 ...

最新文章

  1. elasticsearch update 无结果
  2. cuda版本查看_ubuntu安装CUDA
  3. 一分钟解决 Github 访问慢
  4. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
  5. 一种基于memcache或redis缓存架构的验证码
  6. 如何用 Visual Studio 2017 开发 Arduino 应用程序
  7. Dr.COM 宽带认证客户端频繁掉线问题解决方案
  8. adb—fastboot—Download Honor 4C ClockworkMod (Cofface) Custom Recovery
  9. MathType公式编辑器的下载安装及导入Word
  10. 基层教学组织评估系统6_项目完结心得收获、思考人生篇
  11. 英语3500词(六)relationships主题(2022.1.18)
  12. LayerPagerDemo - 双层可拖拽式布局界面
  13. 云服务器网卡mac地址修改,云服务器 改mac地址吗
  14. 安装程序遇到错误:0x80240037 尝试打开时出错 - WSUSSCAN.cab 错误: 0x80070002。WSUSSCAN.cab文件 是什么?cab 是什么文件?
  15. 关于Java反射获取静态属性值的方式
  16. 打印机问题:虚拟机连接打印机、物理机连接打印机
  17. 使用U-Net 进行图像分割
  18. 什么软件可以测试iphone6s芯片,苹果是对的:测试显示iPhone 6s两款芯片续航差距微小...
  19. 未被定义的 “智能座舱”,如何将产业化进行到底
  20. java三星题之_Java三星题之剪刀石头布(三局两胜)

热门文章

  1. 我用计算机写作文,教学设计:我用计算机写作文
  2. 金融服务公司域名备案
  3. Android 网络请求框架浅解析
  4. c++编程迷宫小游戏
  5. This Week in Spring - July 15, 2013
  6. Improved Robustness to Open Set Inputs viaTempered Mixup
  7. chart metadata is missing these dependencies
  8. 在电子电路中,为什么要进行电气隔离?
  9. MaxKey单点登录认证系统微服务架构v3.0.0GA发布
  10. Andriod 简介