以百度地图SDK 9.3.7 为例。
1.百度地图开放平台创建应用
按此注册开发者账号 https://lbsyun.baidu.com/index.php?title=android-locsdk/quick-start/start
1.1.app签名文件sha1提取
【1】AndroidStudio默认的调试版签名文件在用户名下的.android目录中。直接在AS里点Run时,使用此签名。此签名密码为androi或空:
使用jdk/bin/keytool工具获取sha1:
指令:keytool -list -v -keystore 签名文件
拿到sha1,91:BD:37:F0:9xxxxxxxxxx
【2】自己的发布版签名文件。
创建发布版签名文件:
继续获取发布版签名文件的sha1:
A6:44:B4:A4:Exxxxxxxxxx
1.2.创建应用获取AK
https://lbsyun.baidu.com/apiconsole/key#/home
对应填写上面的两个sha1,
回到我的应用,获取AK,
HfPHjg8U7xxxxxxxxxxxxxxx
2.集成
首先创建一个Android项目。
相关混淆规则:
必要的权限:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> |
2.1.引入库
项目/app/build.gradle。这里直接通过gradle依赖的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
android { defaultConfig { ndk { // 希望百度sdk支持的SO库架构。后4种少有大众手机支持了 abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64", 'mips', 'mips64' } } } dependencies { // 百度sdk //implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.3.7' // 基础定位组件,二选一 implementation 'com.baidu.lbsyun:BaiduMapSDK_Location_All:9.3.7' // 全量定位组件,二选一 implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.5.4' // 检索组件 implementation 'com.baidu.lbsyun:BaiduMapSDK_Util:7.5.4' // 工具组件 implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.5.4' // 地图组件 } |
2.2.添加AK
AndroidManifest.xml/manifest/application/内添加,
1 2 3 4 |
<!-- 百度开放平台注册的应用AK --> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="HfPHjg8xxxxxxxxxxxxxxxxxxxxxxxxxxx" /> |
2.3.引入地图控件
1 2 3 4 5 6 7 8 9 10 11 12 |
public class DemoApp extends Application { @Override public void onCreate() { super.onCreate(); LocationClient.setAgreePrivacy(true); // 定位,同意隐私协议 SDKInitializer.setAgreePrivacy(this, true); // 同意隐私协议 SDKInitializer.initialize(this); // 初始化context信息 SDKInitializer.setCoordType(CoordType.BD09LL); // 坐标类型.有2种:百度坐标BD09LL和国测局坐标GCJ02。【建议和LocationClientOption.setCoorType("bd09ll")一致】 } } |
在布局中引入百度的地图控件:
1 2 3 4 5 6 |
<com.baidu.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" /> |
获取控件,做一些配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public class MainActivity extends AppCompatActivity { private MapView mapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(new LatLng(31.227, 121.481)); // 上海维度、经度 MapStatusUpdate zoomStatus = MapStatusUpdateFactory.zoomTo(18.0f); // 地图缩放级别 mapView = findViewById(R.id.mapView); mapView.removeViewAt(1); // 移除百度Logo BaiduMap baiduMap = mapView.getMap(); baiduMap.setMapStatus(status); // 设置初始位置为上海 baiduMap.setMapStatus(zoomStatus); // 缩放级别 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); // 地图类型:MAP_TYPE_NORMAL普通地图,MAP_TYPE_SATELLITE卫星图,MAP_TYPE_NONE空白 } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } } |
2.4.定位
2.4.1.必须服务
1 2 3 4 5 6 |
<!-- 百度地图定位服务 --> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/> |
2.4.2.必须回调
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class MyLocationListener extends BDAbstractLocationListener { private BaiduMap baiduMap; public MyLocationListener(BaiduMap bm) { this.baiduMap = bm; } @Override public void onReceiveLocation(BDLocation location) { if (null == location || null == baiduMap){ return; } //String addr = location.getAddrStr(); //获取详细地址信息 //String country = location.getCountry(); //获取国家 //String province = location.getProvince(); //获取省份 //String city = location.getCity(); //获取城市 //String district = location.getDistrict(); //获取区县 //String street = location.getStreet(); //获取街道信息 //String adcode = location.getAdCode(); //获取adcode //String town = location.getTown(); //获取乡镇信息 //double latitude = location.getLatitude(); //获取纬度信息 //double longitude = location.getLongitude(); //获取经度信息 //float radius = location.getRadius(); //获取定位精度,默认值为0.0f //String coorType = location.getCoorType(); //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准 //int errorCode = location.getLocType(); //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // .direction(location.getDirection()) // 设置开发者获取到的方向信息,顺时针0-360 .latitude(location.getLatitude()) // 纬度 .longitude(location.getLongitude()) // 经度 .build(); baiduMap.setMyLocationData(locData); // 将地图中心设为定位的坐标 } public void removeBaiduMap() { this.baiduMap = null; } } |
2.4.3.定位参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
public class OptionFactory { public static LocationClientOption getOption() { //通过LocationClientOption设置LocationClient相关参数 LocationClientOption option = new LocationClientOption(); // 设置定位模式,默认Hight_Accuracy // LocationMode.Hight_Accuracy:高精度; // LocationMode. Battery_Saving:低功耗; // LocationMode. Device_Sensors:仅使用设备; // LocationMode.Fuzzy_Locating, 模糊定位模式;v9.2.8版本开始支持,可以降低API的调用频率,但同时也会降低定位精度; option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 是否使用卫星定位,默认false // 使用高精度和仅用设备两种定位模式的,参数必须设置为true option.setOpenGnss(true); // 经纬度坐标类型,默认GCJ02 // GCJ02:国测局坐标; // BD09ll:百度经纬度坐标; // BD09:百度墨卡托坐标; // 海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标 option.setCoorType("bd09ll"); // 【建议和SDKInitializer.setCoordType(CoordType.BD09LL)一致】 // 首次定位,准确性优先还是速度优先,默认为速度优先 // 可以搭配setOnceLocation(Boolean isOnceLocation)单次定位接口使用,当设置为单次定位时,setFirstLocType接口中设置的类型即为单次定位使用的类型 // FirstLocType.SPEED_IN_FIRST_LOC:速度优先,首次定位时会降低定位准确性,提升定位速度; // FirstLocType.ACCUARACY_IN_FIRST_LOC:准确性优先,首次定位时会降低速度,提升定位准确性; option.setFirstLocType(LocationClientOption.FirstLocType.SPEED_IN_FIRST_LOC); // 定位频率,定位请求的间隔,int类型,单位ms // 如果设置为0,则代表单次定位,即仅定位一次,默认为0 // 如果设置非0,需设置1000ms以上才有效 option.setScanSpan(1000); // 是否当卫星定位有效时按照1S/1次频率输出卫星定位结果,默认false option.setLocationNotify(true); // 是否在stop的时候杀死后台定位的service独立进程,默认(建议)不杀死,即setIgnoreKillProcess(true) option.setIgnoreKillProcess(false); // 是否收集Crash信息,默认收集,即参数为false option.SetIgnoreCacheException(false); // 如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位 // 可选,V7.2版本新增能力 // option.setWifiCacheTimeOut(5 * 60 * 1000); // 是否需要过滤卫星定位仿真结果,默认需要,即参数为false //option.setEnableSimulateGnss(false); // 是否需要地址信息,默认为不需要,即参数为false。如果开发者需要获得当前点的地址信息,此处必须为true //option.setIsNeedAddress(true); // 是否需要最新版本的地址信息。默认需要,即参数为true //option.setNeedNewVersionRgc(true); return option; } } |
2.4.4.位置标记显示参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class ConfigurationFactory { public static MyLocationConfiguration getConfiguration() { //定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态) //mCurrentMode = LocationMode.FOLLOWING;//定位跟随态 //mCurrentMode = LocationMode.NORMAL; //默认为 LocationMode.NORMAL 普通态 //mCurrentMode = LocationMode.COMPASS; //定位罗盘态 MyLocationConfiguration.LocationMode mode = MyLocationConfiguration.LocationMode.FOLLOWING; // 定位图标 BitmapDescriptor customMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ico_location_anchor); // 是否允许显示方向信息 boolean enableDirection = true; // 精度圈填充颜色 int accuracyCircleFillColor = 0x00000000; // ARGB。这里完全透明即不显示精度圈 // 精度圈边框颜色 int accuracyCircleStrokeColor = 0x00000000; MyLocationConfiguration configuration = new MyLocationConfiguration(mode, enableDirection, customMarker, accuracyCircleFillColor, accuracyCircleStrokeColor); return configuration; } } |
2.4.5.定位生命周期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
protected void onCreate(Bundle savedInstanceState) { ... 其它代码 ... baiduMap.setMyLocationEnabled(true); // 开启地图的定位图层 baiduMap.setMyLocationConfiguration(ConfigurationFactory.getConfiguration()); // 设置定位模式和标记 //注册LocationListener监听器 locationListener = new MyLocationListener(baiduMap); try { // 定位初始化 locationClient = new LocationClient(this); locationClient.setLocOption(OptionFactory.getOption()); // 设置locationClientOption locationClient.registerLocationListener(locationListener); // 定位回调 locationClient.start(); // 开始定位 } catch (Exception e) { } } protected void onResume() { super.onResume(); mapView.onResume(); locationClient.restart(); } protected void onPause() { super.onPause(); locationClient.stop(); mapView.onPause(); } protected void onDestroy() { super.onDestroy(); baiduMap.setMyLocationEnabled(false); locationListener.removeBaiduMap(); locationClient.stop(); locationClient.unRegisterLocationListener(locationListener); mapView.onDestroy(); } |
3.权限
须要动态申请权限。
- end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/4184.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设