快速接入百度地图定位、描点

这里整理一下接入 百度地图 的流程,做一下记录(基于 Kotlin 语言开发)。

第一步,肯定还是注册账号,创建应用了

先来到百度地图 首页 登录自己或公司的 百度账号(公司项目,一般都是由公司提供账号)。
登录成功之后,首页有一个控制台

这里写图片描述

  • 点击上图标记的控制台,然后选择 【创建应用】

    这里写图片描述

这里只是针对 Android 项目,所以你需要选中 【应用类型】 为 Android SDK , 剩下的就是输入所对应的应用名称,这个一般是和你的项目名称保持一致。所以,输入名称的时候你需要先确定好自己的项目名。当然,后续如果 APP 名称调整了,导致 sdk 无效的话,直接就再次创建一个 相同名字的应用,更换一下 APP_KEY 就好了。

然后就是 标注的地方, 这里获取 发布版和开发版 SHA1 我之前一篇博客整理过(传送)。这里 开发版SHA1 虽然没有必填,但是最好还是添加一下。这样的话,可以保证你在开发过程中,可以直接在调试模式看到地图效果,

这里就不用多说了,直接填入你的 applicationId 。

然后下面就是点击提交, 然后自动跳到应用列表页。这里可以获取到你对应 App 的 APP_KEY 了。

好了,到这里我们的项目就创建完成了,接下来就是开始接入了。

下载并集成 SDK

上面 APP_KEY 获取到之后,我们需要来下载相应的 SDK 开发包(下载地址),这里你可以根据自己需求,选择对应功能进行下载。如果你不需要参照 官方Demo 的话,可以直接下载 开发包。如果需要参照,你可以选择下载 示例代码 ,并且我这里提供一个 百度地图Demo 可以使用的 APP_KEY : ilLQfbEIhHAFMdAbjLKNvcZGrZNqVDDc, 你把demo 跑起来之后,把 manifest 中的 APP_KEY 换掉。我这里当时调试的时候,因为 demo 提示 key 值不对,所以自己创建的一个。

资源文件下载完成之后,把 libs 下的 jar 包,都拷贝到你自己项目的 app/libs 下面,至于其他文件夹下的 so 文件,请连带着文件夹,一起拷贝到 src/main/jniLibs目录(可以自己手动新建)。
添加完成之后,对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在 build.gradle 生成工程所依赖的 jar 文件格式如下:

implementation files('libs/BaiduLBS_Android.jar')

添加权限

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--//获取设备网络状态,禁用后无法获取网络状态-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--//网络权限,当禁用后,无法进行检索等相关业务-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--//读取设备硬件信息,统计数据-->
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <!--//读取系统信息,包含系统版本等信息,用作统计-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--//获取设备的网络状态,鉴权所需网络代理-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!--//获取统计数据-->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!--//鉴权所需该权限获取进程列表-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--//使用步行AR导航,配置Camera权限-->

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="false"
        android:resizeable="true"
        android:smallScreens="true" />

    <!-- OpenGLES 2.0 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />


<application>
    ····
     <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="{替换你的APP_KEY}" />

     <!-- 定位service -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />

    ····
</application>

配置混淆代码如下:

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}    
-dontwarn com.baidu.**

调用

在 Application 中 调用一下方法进行 百度地图 SDK 初始化:

// 初始化百度地图
SDKInitializer.initialize(this)
  • 基础定位功能
private var mLocationClient: LocationClient? = null
 override fun create(savedInstanceState: Bundle?) {
        mLocationClient = LocationClient(this)
        getLocation(BDLocationListener { location ->
            val province = location?.province ?: ""    //获取省份
            val city = location?.city ?: ""   //获取城市
            val district = location?.district ?: ""    //获取区县
            val street = location?.street ?: ""   //获取街道信息
            lat = location?.latitude ?: 0.0
            long = location?.longitude ?: 0.0
            add_sales_record_address.text = province + city + district + street
        })
        init()
    }
    /**
     * 定位,获取当前位置信息
     */
    fun getLocation(listener: BDLocationListener?) {
        mLocationClient?.registerLocationListener(listener)
//        { location ->
//            val addr = location?.addrStr ?: ""    //获取详细地址信息
//            val country = location?.country ?: ""    //获取国家
//            val province = location?.province ?: ""    //获取省份
//            val city = location?.city ?: ""   //获取城市
//            val district = location?.district ?: ""    //获取区县
//            val street = location?.street ?: ""   //获取街道信息
//                       location?.getLocationDescribe()    // 获取位置描述信息

// 这里可以获取经(long)纬度(lat)等信息 location?.latitude  location?.logitude


//        }

        val option = LocationClientOption()
        //可选,是否需要地址信息,默认为不需要,即参数为false
        //如果开发者需要获得当前点的地址信息,此处必须为true
        option.setIsNeedAddress(true)
        option.isOpenGps = true // 打开gps
        option.setCoorType("bd09ll") // 设置坐标类型
        // 定位的频率,每三秒钟定位一次,如果不需要重复定位,可在定位回调监听中调用 mLocationClient?.stop() 
        option.setScanSpan(3000)
        mLocationClient?.locOption = option;
        mLocationClient?.start()
    }

// 记得要页面销毁时调用 mLocationClient 的 stop()方法释放资源
  • 配置 SDK 参数
option.setLocationMode(LocationMode.Hight_Accuracy);
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;

option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认gcj02
//gcj02:国测局坐标;
//bd09ll:百度经纬度坐标;
//bd09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标

option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效

option.setOpenGps(true);
//可选,设置是否使用gps,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true

option.setLocationNotify(true);
//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false

option.setIgnoreKillProcess(false);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)

option.setIgnoreCacheException(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false

option.setWifiValidTime(5*60*1000);
//可选,7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位

option.setEnableSimulateGps(false);
//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
  • 显示地图图层
    布局文件:
<com.baidu.mapapi.map.TextureMapView
        android:id="@+id/common_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"

这里如果直接使用 BaiduMap 的话, 可能会出现闪屏问题。

页面中初始化:

 common_map.map.isMyLocationEnabled = true
 // 设置图标显示
 common_map.map.setMyLocationConfiguration(MyLocationConfiguration(
                MyLocationConfiguration.LocationMode.NORMAL, false, null))
  • * MyLocationConfiguration 的参数:*

参数 1 :是图层显示模式有三种选择:

MyLocationConfiguration.LocationMode.COMPASS 罗盘模式
MyLocationConfiguration.LocationMode.FOLLOWING 跟随模式
MyLocationConfiguration.LocationMode.NORMAL 默认模式

参数 2 是一个 布尔类型 ,控制是否显示方向,这里是 false 默认在地图显示的是一个 蓝色圆点,设置 true 的话,会带有一个方向箭头 。

参数 3 用来设置显示图标的,如果需要自定义当前位置显示的图标,可以通过此参数来修改。

  • 显示当前位置在地图上:
    这里整理了两种方式,:
    1,需要通过一个 boolean 值进行标识,否则移动一点地图,就会立马归为当前位置。如下代码:isFrist 内部执行完之后,需要设置 isFirst = false .
/**
     * 定位到指定位置
     */
    fun locateTarget(map: BaiduMap, lat: String, long: String, isFirst: Boolean) {
        map.setMyLocationData(MyLocationData.Builder().latitude(lat.toDouble()).longitude(long.toDouble()).build())
        val ll = LatLng(lat.toDouble(),
                long.toDouble())
        val builder = MapStatus.Builder()
        if (isFirst) {
            //第一次直接缩放到当前位置,如果没有判断,则拖动地图之后会自动归为当前 LatLng 所标记地点。
//            isFirst = false
            builder.target(ll).zoom(18.0f)
        }
        builder.overlook(0f)
        map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()))
    }

2,直接定位到当前位置,

// 初次直接使用此方法定位,需要设置此段代码标明是我的位置。
map.setMyLocationData(MyLocationData.Builder().latitude(latitude).longitude(longitude).build())

val ll = LatLng(latitude, longitude)
val mapStatus = MapStatusUpdateFactory.newLatLngZoom(ll, 18f)
BaiduMap.setMapStatus(mapStatus)

以上两种方式中的数字 18 表示放大倍数。可以根据自己需要调试一下。

  • 地图描点(可在子线程中执行)
private var marker: BitmapDescriptor? = null
    /**
     * 设置描点
     */
    fun setMarker(map: BaiduMap, lat: String?, long: String?): Boolean {
        if (marker == null) {
            marker = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding)
        }
        if (!TextUtils.isEmpty(lat) && !TextUtils.isEmpty(long)) {
            val latLng = LatLng(lat!!.toDouble(), long!!.toDouble())
            val ooA = MarkerOptions().position(latLng).icon(marker)
                    .zIndex(9).draggable(true)
            map.addOverlay(ooA)
            return true
        }
        return false
    }

注意:界面销毁是要记得 调用 marker.recycle() 方法释放资源。

目前就整理这么多,未完待续~

END

猜你喜欢

转载自blog.csdn.net/lv_fq/article/details/78620306