1、开发背景
2、开发环境
2.1基础开发环境
2.2百度地图环境
2.3高德地图环境
2.4腾讯地图环境
3、工程配置
3.1 添加jar包
3.2 添加so文件
3.3 AndroidMainfest.xml配置
4.百度地图与定位
5.高德地图与定位
6.腾讯地图与定位

1、开发背景
由于公司在开发安卓项目时,需要用到定位功能,所以需要选择定位精度高的地图SDK。现在将市面上应用最广泛的三家地图服务集成到一个APP上,实现百度地图、高德地图、腾讯地图的对比。现将整个开发步骤进行记录。
2、开发环境
2.1基础开发环境
AndroidStudio 3.4.2
Gradle Version:gradle-5.1.1-all.zip
Gradle plug-in:3.4.2
2.2百度地图环境
百度地图开发者开放平台链接:官网
百度基础地图SDK下载地址 :下载地址
百度地图定位SDK下载地址:下载地址
百度地图开发jar包:BaiduLBS_Android.jar
百度地图开发so文件:
liblocSDK7b.so
libBaiduMapSDK_base_v5_2_1.so
libBaiduMapSDK_map_v5_2_1.so
2.3高德地图环境
高德开放平台:官网
高德基础地图SDK:下载地址
高德地图定位SDK:下载地址
高德地图开发jar包:
AMap_Location_V4.7.0_20190708.jar
Android_Map3D_SDK_V6.9.2_20190709.jar
高德地图开发so文件:不需要
2.4腾讯地图环境
腾讯开放平台:官网
腾讯基础地图SDK:下载地址
腾讯地图定位SDK:下载地址
腾讯地图开发jar包:
tencent-mapsdk-library-MainRelease-4.2.5.15519d1.jar
TencentLocationSdk_v7.1.7_r02c4bb5a_20190523_115148.jar
腾讯地图开发so文件:
libtencentloc.so
libtxmapengine.so
3、工程配置
3.1 添加jar包
使用AndroidStudio创建一个新的项目。然后将下载的jar拷贝到libs目录下。

之后File->Project Structure

点击+号,选择jar Dependency。

添加libs下的jar包。之后,OK。
在app目录下的build.gradle中就可以看到添加的内容。

3.2 添加so文件
在main目录下,创建一个新的文件夹jniLibs。
将下载的so文件拷贝到jniLibs文件夹中。

到此,开发所依赖的环境已做好。
3.3 AndroidMainfest.xml配置
地图开发需要调用手机的权限,在xml文件中添加如下权限。

<!-- 百度定位权限 -->
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 高德定位其余权限 -->
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 用于申请调用A-GPS模块 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于申请获取蓝牙信息进行室内定位 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 腾讯定位其余权限 -->
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


添加在三个开发平台申请的开发秘钥。

到此开发的基础环境工作也做完。
4.百度地图与定位
在百度地图的xml文件中添加MapView控件

<com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/>


在BaiduActivity.java中编写代码。
添加指南针、比例尺等控件

 public void mapSetting(){if(mBaiduMap==null){mBaiduMap=mBaiduMapView.getMap();UiSettings settings=mBaiduMap.getUiSettings();//设置显示定位按钮,并且可以点击//aMap.setLocationSource(this);//设置了定位的监听,这里实现LocationSource接口settings.setCompassEnabled(true);//添加指南针mBaiduMap.setMyLocationEnabled(true);}}

开启定位的方法

private void baiDuLocation() {//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动LocationClient locationClient = new LocationClient(getApplicationContext());//声明LocationClient类实例并配置定位参数LocationClientOption locationOption = new LocationClientOption();MyLocationListener myLocationListener = new MyLocationListener();//注册监听函数locationClient.registerLocationListener(myLocationListener);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;locationOption.setCoorType("bd09ll");//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的locationOption.setScanSpan(1000);//可选,设置是否需要地址信息,默认不需要locationOption.setIsNeedAddress(true);//可选,设置是否需要地址描述locationOption.setIsNeedLocationDescribe(true);//可选,设置是否需要设备方向结果locationOption.setNeedDeviceDirect(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果locationOption.setLocationNotify(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死locationOption.setIgnoreKillProcess(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”locationOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到locationOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否收集CRASH信息,默认收集locationOption.SetIgnoreCacheException(false);//可选,默认false,设置是否开启Gps定位locationOption.setOpenGps(true);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用locationOption.setIsNeedAltitude(false);//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者locationOption.setOpenAutoNotifyMode();//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者locationOption.setOpenAutoNotifyMode(3000,1, LocationClientOption.LOC_SENSITIVITY_HIGHT);//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用locationClient.setLocOption(locationOption);//开始定位locationClient.start();}

定位窗口的移动方法

public void moveTo(double lat,double lon){LatLng cenpt=new LatLng(lat,lon);MapStatus mMapStatus=new MapStatus.Builder().target(cenpt).zoom(17).build();//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);//改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);BitmapDescriptor bitmap= BitmapDescriptorFactory.fromResource(R.mipmap.ic_location);OverlayOptions option = new MarkerOptions().position(cenpt).icon(bitmap);mBaiduMap.addOverlay(option);
}

5.高德地图与定位
在高德地图的xml文件中添加MapView

<com.amap.api.maps.MapViewandroid:id="@+id/gaodemap"android:layout_width="match_parent"android:layout_height="match_parent">
</com.amap.api.maps.MapView>

设置指南针、比例尺等

public void mapSetting(){if(aMap==null){aMap=mGaodeMaoView.getMap();UiSettings settings=aMap.getUiSettings();//设置显示定位按钮,并且可以点击//aMap.setLocationSource(this);//设置了定位的监听,这里实现LocationSource接口settings.setCompassEnabled(true);//添加指南针settings.setMyLocationButtonEnabled(true);aMap.getCameraPosition();//方法可以获取地图的旋转角度settings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);//设置LOGOsettings.setScaleControlsEnabled(true);//设置比例尺aMap.setMyLocationEnabled(true);}
}

开启定位方法

private void gaoDeLocation() {mLocationClient=new AMapLocationClient(getApplicationContext());//初始化定位mLocationClient.setLocationListener(mLocationListener);//设置定位回调监听mLocationOption=new AMapLocationClientOption();//初始化AMapLocationClientOption对象            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//选择定位模式mLocationOption.setOnceLocation(false);//获取多次定位mLocationOption.setOnceLocationLatest(true);//获取3S内精度最高的一次定位mLocationOption.setInterval(2000);//设置定位间隔mLocationOption.setNeedAddress(true);//设置是否需要返回地址信息mLocationOption.setMockEnable(true);//设置是否允许模拟位置mLocationOption.setHttpTimeOut(20000);//设置定位超时mLocationClient.setLocationOption(mLocationOption);//给定位客户端设置定位参数mLocationClient.startLocation();//启动定位
}

监听回调方法

public AMapLocationListener mLocationListener=new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if(aMapLocation !=null){if(aMapLocation.getErrorCode()==0){aMapLocation.getLocationType();//获取当前定位结果来源double lat=aMapLocation.getLatitude();//获取纬度double lon=aMapLocation.getLongitude();//获取经度float accuracy=aMapLocation.getAccuracy();//获取精度信息String adress=aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。String country=aMapLocation.getCountry();//国家信息String province=aMapLocation.getProvince();//省信息String city=aMapLocation.getCity();//城市信息String district=aMapLocation.getDistrict();//城区信息String street=aMapLocation.getStreet();//街道信息String streetNum=aMapLocation.getStreetNum();//街道门牌号信息String cityCode=aMapLocation.getCityCode();//城市编码String adCode=aMapLocation.getAdCode();//地区编码String aoiName=aMapLocation.getAoiName();//获取当前定位点的AOI信息String buildingId=aMapLocation.getBuildingId();//获取当前室内定位的建筑物IdString floor=aMapLocation.getFloor();//获取当前室内定位的楼层int gpsAccuracyStatus=aMapLocation.getGpsAccuracyStatus();//获取GPS的当前状态SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//获取定位时间Date date = new Date(aMapLocation.getTime());String dt=df.format(date);String add=adress+country+province+city+district+street+streetNum;loc_gaode.setText("高德定位:纬度:"+lat+"|"+"经度:"+lon+"|"+"精度:"+accuracy+"|"+"地址信息:"+add+"当前GPS状态:"+gpsAccuracyStatus+"|"+"定位时间:"+dt);if(isFirstLoc){MyLocationStyle myLocationStyle=new MyLocationStyle();//初始化定位小蓝点样式myLocationStyle.interval(1000);myLocationStyle.showMyLocation(true);aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的styleaMap.setMyLocationEnabled(true);//设置表示启动显示蓝点aMap.moveCamera(CameraUpdateFactory.zoomTo(zoomlevel));//设置缩放级别aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(),aMapLocation.getLongitude())));//将地图移动到定位点mListener.onLocationChanged(aMapLocation);//点击按钮,能够将地图的中心移动到定位点isFirstLoc=false;}}else{//定位失败,可通过ErrCode码信息确定失败的原因Log.e("AmapError","Location Error,Error:"+aMapLocation.getErrorCode()+",errInfo:"+aMapLocation.getErrorInfo());}}}
};

6.腾讯地图与定位
在腾讯地图的xml文件中添加MapView

<com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/tencentMap"android:layout_width="match_parent"android:layout_height="match_parent"/>

添加指南针、比例尺等控件

public void userSetting(){tencentMap.setMapStyle(TencentMap.MAP_TYPE_NORMAL);//设置显示地图的类型:普通、卫星、实时路况UiSettings mysetting=tencentMap.getUiSettings();mysetting.setZoomControlsEnabled(true);//设置放大缩小mysetting.setCompassEnabled(true);//开启指南针tencentMap.setMyLocationEnabled(true);
}

开启定位

public void tencentLocation(){TencentLocationRequest request = TencentLocationRequest.create();request.setInterval(1000);request.setRequestLevel(4);request.setAllowCache(true);Context context=this;TencentLocationListener tencentLocationListener=this;TencentLocationManager locationManager=TencentLocationManager.getInstance(context);int error=locationManager.requestLocationUpdates(request,tencentLocationListener);if(error==0){Log.v("this","注册位置监听器成功!");}else {Log.v("this","注册位置监听器失败!");}
}

位置更新时的回调

@Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {if (TencentLocation.ERROR_OK == i) {// 定位成功if(tencentLocation!=null){double lat=tencentLocation.getLatitude();double lon=tencentLocation.getLongitude();double accuracy=tencentLocation.getAccuracy();//精度String nation=tencentLocation.getNation();//国家String province=tencentLocation.getProvince();//省份String city =tencentLocation.getCity();//城市String district=tencentLocation.getDistrict();//区String town=tencentLocation.getTown();//镇String street=tencentLocation.getStreet();//街道String streetNo=tencentLocation.getStreetNo();//门号String add=nation+province+city+district+town+street+streetNo;loc_tencent.setText("腾讯定位:"+"纬度:"+lat+"|"+"经度:"+lon+"|"+"精度:"+accuracy+"|"+"地址信息:"+add);moveTo(lat,lon,town,add);}} else {// 定位失败Log.v("this", "定位失败!");}
}

定位中心以及窗口的移动

public void moveTo(double lat,double lon,String street,String add){LatLng centPosition = new LatLng(lat,lon);CameraUpdate cameraSigma=CameraUpdateFactory.newCameraPosition(new CameraPosition(centPosition,//新的中心点坐标17,//新的缩放级别0,//俯仰角0~45°(垂直地图为0)0//偏航角0~360°(正北方为0)));final Marker marker = tencentMap.addMarker(new MarkerOptions().position(centPosition).title(street).snippet(add));marker.setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_location));//创建图标tencentMap.moveCamera(cameraSigma);
}

7.DEMO实例
效果展示截图



有兴趣的各位同学,可以点击这里下载源码。

百度地图、高德地图、腾讯地图三位一体地图定位开发相关推荐

  1. [html] 如何使用H5唤起原生地图APP(百度、高德、腾讯地图等)

    [html] 如何使用H5唤起原生地图APP(百度.高德.腾讯地图等) <iframe src="sinaweibo://qrcode"> 或 <a href=& ...

  2. android app调用第三方地图路线规划导航(百度,高德,腾讯)

    android app调用第三方地图路线规划导航(百度,高德,腾讯) 因为直接使用高德的sdk提供的导航被投诉说不准,所以需要接第三方. 把BAT系的地图都接上了,有兄弟找到其他的地图调用方法告诉下小 ...

  3. android 跳转腾讯地图导航,Android 跳转到百度、高德、腾讯地图导航

    项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...

  4. android 跳转腾讯地图导航,Android 地图跳转到百度、高德、腾讯导航

    项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...

  5. 百度、高德、腾讯、天地图、谷歌、必应等地图切图工具 MapCutter 3.7.1

    百度.高德.腾讯.天地图.谷歌.必应等自定义地图/图片叠加层/瓦片图/金字塔图地图切图高清切片生成工具 MapCutter(旧名MapTiler) ,定位便捷,支持超大地图,支持leaflet.map ...

  6. android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能

    import android.content.Context; import android.content.Intent; import android.net.Uri;import java.ut ...

  7. 天地图、百度、高德、腾讯、Leaflet、openlayers地图图片叠加层切片生成工具使用

    这个工具可以把一个大图切割成256*256的小图并分级别贴到地图上,目前支持的地图类型是天地图.百度.高德.腾讯.Leaflet.openlayers. 部分切图效果: 1.高德 吴淞炮台:浏览 2. ...

  8. 百度、高德、腾讯、天地图、谷歌、必应地图切片切图工具 MapCutter(旧名MapTiler),支持超大图、高清切片、webgl、leaflet、maptalk、openlayers、cesium等

    # MapCutter 地图覆盖图瓦片地图(金字塔图)切图工具,支持百度.腾讯.高德.天地图.谷歌.必应地图等,是市面上最易使用的同类软件.. 百度.高德.腾讯.天地图.谷歌.必应等自定义地图/图片叠 ...

  9. github、百度、高德及腾讯坐标转换精度测试

    百度.高德.腾讯及github坐标转换精度测试 结论 GCJ02转BD09 BD09转GCJ02 WGS84转GCJ02 WGS84转BD09 结论 前言: 以下结论均来自于单点转换的测试,仅供参考, ...

  10. ios html调起高德地图,iOS开发笔记 调起本地地图导航(百度、高德、腾讯、苹果自带)...

    地图 从自己的APP跳转到用户本地的APP进行导航.首先,要先查看用户都安装了哪些地图类APP. 下面分3种情况进行分析: 1.用户没有安装第三方的地图,只有苹果自带的地图应用. 2.用户安装一款第三 ...

最新文章

  1. R语言描述性统计分析:相关性分析
  2. struts2 property标签的使用技巧
  3. 解决jmeter响应中文乱码及解码
  4. python ini文件操作
  5. C++中的虚函数与纯虚函数
  6. h264.265裸流和音频(ALAW或PCM)封装为mp4
  7. openresty开发系列33--openresty执行流程之3重写rewrite和重定向
  8. C# 截取图片的方法
  9. Raft成员变更的工程实践
  10. I00025 寻找循环数
  11. 同样一句代码,在类内调用,跟类外调用结果不同?
  12. Tool -- 01 -- xml与map相互转换
  13. 《松本行弘的程序世界》读书笔记
  14. 【微信小程序】自定义导航栏
  15. tcpreplay linux,Linux——Tcpreplay
  16. 常用邮箱服务器地址大全截止2020-9
  17. Android强行进阶:为何大厂APP如微信、支付宝、淘宝、手Q等只适配了armeabi-v7a/armeabi?
  18. 新闻发布系统——INSERT 语句与 FOREIGN KEY 约束XXX冲突。该冲突发生于数据库XXX,表XXX, column 'XXX。
  19. 昨天介入600571,信雅达,喜欢的朋友可以跟进!
  20. 阿里云服务器配置(一)基础

热门文章

  1. access数据库应用系统客观题_Access制作客观题考试系统的应用
  2. 介绍make menuconfig中的每个选项含义
  3. 柯尼卡美能达一体机 扫描文件,不是全彩的,就首页和尾页是彩色,中间黑白
  4. matlab中fft与fftshift,在matlab中使用fft,ifft和fftshift
  5. STM8L152C6T6+IAP详解,包教包会
  6. [项目实战篇] Emos在线办公小程序--搭建项目
  7. Web漏洞总结: OWASP Top 10
  8. 中兴 F607 光猫超级管理用户查看
  9. mongoDB清空数据库
  10. 生物信息学: 导论与方法 | 总结笔记