美文网首页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