美文网首页Android 三方集成
Android 百度地图,定位,maker 功能实现

Android 百度地图,定位,maker 功能实现

作者: 没有了遇见 | 来源:发表于2022-03-18 15:23 被阅读0次
效果.gif

百度地图,百度定位,度搜索功能实现

1.开发者注册配置

百度地图文档

image.png

2.开发者App配置

2.1.获取App的SHA1以及包名

2.1.1 配置bulid.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

static def stringValue(def value) {
    return "\"${value}\""
}
android {
    compileSdkVersion = 30
    buildToolsVersion = "30.0.3"

    defaultConfig {
        applicationId "com.wu.material"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
        ndk {
            // 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
            abiFilters "armeabi-v7a"
        }
    }


    signingConfigs {
        debug {
            storeFile file("../material.keystore")
            storePassword '123456'
            keyAlias 'material'
            keyPassword '123456'
        }

        release {

            storeFile file("../material.keystore")
            storePassword '123456'
            keyAlias 'material'
            keyPassword '123456'
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            zipAlignEnabled true
            debuggable = true
            buildConfigField "String", "APP_WECHAT_KEY", stringValue("wx61ac9619cdafdbd8")

        }
        release {
            signingConfig signingConfigs.release
            zipAlignEnabled true
            debuggable = false
            buildConfigField "String", "APP_WECHAT_KEY", stringValue("wx61ac9619cdafdbd8")
        }
    }

    //输出包
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "material-${variant.versionName}-${variant.name}.apk"
        }
    }
    repositories {
        flatDir {
            dirs "lib"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    buildFeatures {
        dataBinding = true
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    implementation "androidx.lifecycle:lifecycle-viewmodel:2.4.0"
    implementation "androidx.multidex:multidex:2.0.0"

    implementation 'com.github.bumptech.glide:glide:4.13.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'

    //携程
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"

    implementation 'com.google.code.gson:gson:2.8.6'

    //指针
    implementation 'com.github.hackware1993:MagicIndicator:1.5.0'
    //定位
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8'
    //地图
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Util:7.4.0'
}
app bulid.gradle配置.png

2.2.2 执行 bulid.gradle 的 signingReport 任务 获取SHA1 MD5

image.png

注意:

1.生成签名
2.获取SHA1

2.2. 在百度地图开发者中配置App 的名字,类型,选择支持的功能配置SHA1 以及包名


配置App数据.png

3.百度地图在项目中配置

1.配置资源包

  //定位
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8'
    //地图
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Util:7.4.0'

2.配置权限

   <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,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" />

3.百度地图定位的其他配置


        <!-- 百度地图 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="百度key" />
        <!-- 定位配置 -->
        <service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>
资源配置.png

4.开启项目中使用 百度地图和百度定位,以及百度搜索功能

4.1 Application 中初始化百度地图已经定位的SDK

package com.wu.material.application

import androidx.multidex.MultiDexApplication
import com.baidu.mapapi.CoordType
import com.baidu.mapapi.SDKInitializer


/**
 * @author wkq
 *
 * @date 2022年03月17日 16:59
 *
 *@des Application 初始化操作
 *
 */

class MaterialApplication :MultiDexApplication(){

    override fun onCreate() {
        super.onCreate()
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }


}

4.2 配置创建百度Map,

package com.wu.material.bdmap

import android.Manifest
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.map.*
import com.baidu.mapapi.model.LatLng
import com.wu.material.observable.BaiduLoactionObservable
import com.wu.material.util.PermissionsUtil
import java.util.*


/**
 * @author wkq
 *
 * @date 2022年03月18日 9:38
 *
 *@des  Map 记住库  裸装地图  处理权限 以及初始化地图以及定位
 *
 */

abstract class BaseMapActivity : AppCompatActivity(), Observer {

    //权限Code
    var REQUEST_MAP = 10011
    var permissionsREAD = arrayOf(
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
    var mLocationClient: LocationClient? = null
    var baiduMap: MapView? = null
    var parentMap: RelativeLayout? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        addRootView()
        BaiduLoactionObservable.addObserver(this)
        // 判断权限
        var isHave = PermissionsUtil.checkPermissions(this, permissionsREAD, REQUEST_MAP)
        if (isHave) {
            baiduMap!!.map.isMyLocationEnabled = true
            startLocation()
        }
    }

    /**
     * 添加跟布局
     */
    private fun addRootView() {
        parentMap = RelativeLayout(this)
        var options = BaiduMapOptions()
        options.compassEnabled(false)
        options.mapType(BaiduMap.MAP_TYPE_NORMAL)
        options.scaleControlEnabled(false)
        options.zoomControlsEnabled(false)
        baiduMap = MapView(this, options)
        parentMap!!.addView(baiduMap)
        setContentView(parentMap!!)
    }

    //授权的回调监听
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String?>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_MAP) {
            val hasPermissions =
                PermissionsUtil.onRequestPermissionsResult(
                    this,
                    requestCode,
                    permissions,
                    grantResults
                )
            if (hasPermissions!![0]) {
                startLocation()
            } else {
                showErr("暂无定位权限")
            }
        }
    }

    override fun onResume() {
        baiduMap!!.onResume()
        super.onResume()

    }
    override fun onPause() {
        baiduMap!!.onPause()
        super.onPause()
    }
    override fun onDestroy() {
        baiduMap!!.onDestroy()
        baiduMap!! == null
        super.onDestroy()
        BaiduLoactionObservable.deleteObserver(this)
        if (mLocationClient != null) mLocationClient!!.stop()
    }

    /**
     * 移动地图
     */
    fun mapMovingLocation(ll: LatLng, zoom: Float = 18f) {
        val builder: MapStatus.Builder = MapStatus.Builder()
        builder.target(ll).zoom(18.0f)
        baiduMap!!.map.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()))
    }

    override fun update(o: Observable?, arg: Any?) {
        //百度定位结果监听
        if (o is BaiduLoactionObservable && arg != null) {
            var location = arg as MyLocationData
            baiduMap!!.map.setMyLocationData(location)
            var lat = LatLng(location.latitude, location.longitude)
            mapMovingLocation(lat)
        }
    }
    //展示错误信息
    abstract fun showErr(message: String)
    //初始化创建定位的监听
    abstract fun initLocation(option: LocationClientOption)
    //开启定位
    abstract fun startLocation()
}

4.2 百度定位 的配置

    var option = LocationClientOption()
        // 可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度;
        option!!.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.isOpenGps = true // 打开gps
        option.setCoorType("bd09ll") // 设置坐标类型
        option.setScanSpan(1000)
        //开启单次定位
        option.setOnceLocation(true);
        initLocation(option)

4.3 定位,搜索,maker ,切换地图类型 等功能实现

package com.wu.material.bdmap

import android.R
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.Toast
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.map.BitmapDescriptorFactory
import com.baidu.mapapi.map.MarkerOptions
import com.baidu.mapapi.map.OverlayOptions
import com.baidu.mapapi.model.LatLng
import com.baidu.mapapi.search.sug.SuggestionSearch
import com.baidu.mapapi.search.sug.SuggestionSearchOption
import com.wu.material.observable.BaiduSearchObservable
import java.util.*


/**
 * @author wkq
 *
 * @date 2022年03月17日 17:18
 *
 *@des  功能提供层  提供地图的各种通用功能
 *
 */

open abstract class MapOptionActivity : BaseMapActivity(), Observer {

    override fun onCreate(savedInstanceState: Bundle?) {
        initMapOptionLocation()
        super.onCreate(savedInstanceState)
    }

    /**
     * 添加上下浮层
     * location  0 1 2 3  上下左右
     */
    fun addLayerView(layerView: View, location: Int = 0) {
        if (layerView == null) return
        var lp = RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
        )
        when (location) {
            0 -> {
                lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE)
            }
            1 -> {
                lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE)
            }
            2 -> {
                lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE)
            }
            3 -> {
                lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)
            }
        }
        parentMap!!.addView(layerView, lp)
    }

    /**
     * 开启定位
     */
    override fun startLocation() {
        if (mapLocationOption == null) return
        mLocationClient = LocationClient(this);
        mLocationClient!!.setLocOption(mapLocationOption)
        var listener = BaiduLoactionListener()
        mLocationClient!!.registerLocationListener(listener)
        mLocationClient!!.start()
    }

    /**
     * 关闭定位
     */
    fun stopLocation() {
        if (mLocationClient != null) mLocationClient!!.stop()
    }

    /**
     * 设置地图类型
     *
     * type: 1: MAP_TYPE_NORMAL(普通)  2:MAP_TYPE_SATELLITE(卫星)  3: MAP_TYPE_NONE(空白地图)
     */
    fun setMapType(type: Int) {
        baiduMap!!.map.setMapType(type)
    }

    /**
     * 搜索功能  结果以观察者方式对外发出
     */
    fun searchAddress(address: String) {
        var mSuggestionSearch = SuggestionSearch.newInstance();
        mSuggestionSearch.setOnGetSuggestionResultListener {
            if (it != null && it.allSuggestions != null && it.allSuggestions.size > 0) {
                BaiduSearchObservable.update(it)
            } else {
                showErr("未搜索到内容")
            }
        }

        mSuggestionSearch.requestSuggestion(SuggestionSearchOption().city("北京").keyword(address))
    }

    /**
     * 出我提示
     */
    override fun showErr(message: String) {
        Toast.makeText(this@MapOptionActivity, message, Toast.LENGTH_SHORT).show()
    }

    var mapLocationOption: LocationClientOption? = null
    override fun initLocation(option: LocationClientOption) {
        mapLocationOption = option
    }

    fun openIndoorEnable() {
        baiduMap!!.map.setIndoorEnable(false)
    }

    /**
     * 添加maker点
     */
    fun addmark(latitude: Double, longitude: Double, res: Int = R.drawable.ic_input_add) {
        //定义Maker坐标点
        val point = LatLng(latitude, longitude)
        //构建Marker图标
        val bitmap = BitmapDescriptorFactory
            .fromResource(res)
        //构建MarkerOption,用于在地图上添加Marker
        val option: OverlayOptions = MarkerOptions()
            .position(point)
            .icon(bitmap)
        //在地图上添加Marker,并显示
        baiduMap!!.map.addOverlay(option)

    }

    /**
     * 初始化定位配置
     */
    abstract fun initMapOptionLocation()


}

总结

简单实现了 百度地图展示,图层切换,添加maker点 以及移动的功能 ,百度定位实现了获取定位数据获取的功能,百度所有正常搜索出来了需要的数据,接下来的就是一些具体页面功能的实现未实现
如有帮助,不介意点个赞吧.

资料

1.生成签名
2.获取SHA1
3.百度地图文档
4.源码地址

相关文章

网友评论

    本文标题:Android 百度地图,定位,maker 功能实现

    本文链接:https://www.haomeiwen.com/subject/vywidrtx.html