高德地图全解析--定位篇

来源:互联网 发布:札幌住宿 知乎 编辑:程序博客网 时间:2024/06/04 17:54

之前使用的是百度地图的定位功能,不知道什么原因注册的时候总是失败,而且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><!--用于访问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
//开发者申请的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();//设置连接超时时间
等等小伙伴可以根据自己的需求进行发觉,这里就不再多说了。

0 0
原创粉丝点击