之前使用的是百度地图的定位功能,不知道什么原因注册的时候总是失败,而且JAR和SO的匹配也弄的我十分蛋疼,最后换了最新的JAR和SO依然不好使,回调函数一直失败,究竟是为了什么,我也不知道。反正结果是我醉了ORZ。
但是那条条大陆通罗马吧,启用高德定位,这货好使了,但是,但是,但是,最恶心的是这货的验证机制,真尼玛不想说,特别难弄。日了狗了。这里面的蛋疼就不说了,但是它也确实是好用的,而且功能比较完善,而且开源这里支持一下!
以下内容会按照使用流程进行解析只说android studio IDE下怎么使用
一、和很多国内的开源API一样当然是注册一个开发者帐号啦
二、注册完成之后使用公司或者个人的keystore.jks获取绑定所要使用的SHA1签名指纹。
若没有自己生成成,具体方法,请百度。
这里的坑不多,主要是打开jsk
产看jsk的方法是在DOS界面在存放key.store的地址使用命令
keytool -list -keystore yourkeystore.jks
就可以在命令行里看到相应的SHA1串。一共20对,复制的时候一定要注意别复制少了,在复制完成之后务必对照一遍,因为就整个高德地图来说这个是最恶心的,必须签名,否则定位不好使。
三、下载定位包,这里推荐新手下载API和DEMO,如果是有经验的可以直接上API。
四、有了API之后,解压,复制到项目的libs目录下面,然后项目管理,添加依赖,就这么简单。查看是否添加成功可以在build,gradle里查看是否产生里依赖。
五、由于定位大多数的时候是在Service占用运行的,所以我们当然也要添加高德自己的定位服务,(这步要在依赖之后添加)。其操作为在AndroidManifest.xml中添加高德的后台服务
六、声明权限 主要有一下权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">uses-permission>
<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
//开发者申请的key
那么如何获得该KEY那,在我们注册的时候就是为了获取该KEY做的准备。
1.点击右上角开发者信息->左上角 我的应用
2.然后右上角创建新应用 名字随意
3.添加新的KEY
这里注意key名称自定义没问题,服务平台选择Android平台SDK
然后填写发布版安全码SHA1就是之前让大家获取的SHA1,千万别写错,然后看看有没有什么空格什么的,Package 可以在AndroidManifest里面进行查看。
添加完成之后,就可以获得自己的开发者key了。
八、最后设置自己的application Key
//开发者申请的key
九、也就是最重要的我们来讲DEMO这里直接讲混合定位,因为根据Android定位原理,也就是GPS定位和NET定位。即走GPS和网络,而高德的DEMO里面解直接有混合定位功能,即那个精度高使用那个定位的结果。其界面是这样的。
根据这张图片我们可以很清楚的知道,我们在service中需要使用的定位模式,如果我们需要实时的进行定位那么我们就可以查看持续定位功能,并且设置定位周期(毫秒级且最少1000)。和单次定位功能。
首先我们先从两者的共性中进行分析即一些参数。
//定位客户端
private AMapLocationClient locationClient = null;
//定位客户端配置
private AMapLocationClientOption locationOption = null;
之后在onCreate中进行参数的初始化。
locationClient = new AMapLocationClient(this.getApplicationContext());
locationOption = new AMapLocationClientOption();
// 设置定位模式为高精度模式
locationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 设置定位监听
locationClient.setLocationListener(this);
这里面的四句话第一局是获得Application以初始化定位客户端。
第二句是初始化定位参数对象。
第三句是设置定位的模式 高精度模式
第四句是设置定位监听,即按周期或者单次定位返回数据后回调的函数,我们也根据这句话获取需要的相关信息。
//其类型有省电模式、设备模式(仅使用GPS定位)、高精度模式
public static enum AMapLocationMode {
Battery_Saving, Device_Sensors, Hight_Accuracy;
private AMapLocationMode() { /* compiled code */ }
}
十、这些都写完之后,我们就可以初始化定位配置项,以开始定位了。
在选择开始定位之后进行的工作
10.1
private void initOption() {
// 设置是否需要显示地址信息
locationOption.setNeedAddress(cbAddress.isChecked());
/**
* 设置是否优先返回GPS定位结果,如果30秒内GPS没有返回定位结果则进行网络定位
* 注`这里写代码片`意:只有在高精度模式下的单次定位有效,其他方式无效
*/
locationOption.setGpsFirst(cbGpsFirst.isChecked());
//“设置请求周期”
String strInterval = seconds*1000+"";
if (!TextUtils.isEmpty(strInterval)) {
// 设置发送定位请求的时间间隔,最小值为1000,如果小于1000,按照1000算
locationOption.setInterval(Long.valueOf(strInterval));
}
}
10.2 在初始化配置之后将参数交给客户端 后启动定位
// 设置定位参数
locationClient.setLocationOption(locationOption);
// 启动定位
locationClient.startLocation();
对应的停止定位为
locationClient.stopLocation();
十一、在第九步所写的locationClient.setLocationListener(this);是添加位置返回回调,其写法可以参考如下
11.1接入AMapLocationListener 接口 重写 onLocationChanged方法
@Override
public void onLocationChanged(AMapLocation loc) {
if (null != loc) {
//其中主要的信息封装在loc 中可以常看loc的子方法,获取想要的参数。
Message msg = mHandler.obtainMessage();
msg.obj = loc;
msg.what = MSG_LOCATION_FINISH;
latitude=loc.getLatitude()+"";
longitude=loc.getLongitude()+"";
//使用handler进行信息回调处理
mHandler.sendMessage(msg);
}
}
十二、一些参数的设置以及使用以区分到底是GPS优先 单次 或者周期循环定位等等
locationOption.setNeedAddress(false);//是否需要返回地址信息
locationOption.setOnceLocation(false);//是否为一次定位
locationOption.setGpsFirst(true);//是否优先使用GPS进行定位
locationOption.setHttpTimeOut();//设置连接超时时间
等等小伙伴可以根据自己的需求进行发觉,这里就不再多说了。