Android中引用百度地图sdk

本文介绍了如何在Android应用中集成百度地图SDK,从注册开发者、配置权限到初始化SDK,以及设置地图控件和实现定位功能的详细步骤。同时,指出了在开发过程中需要注意的权限问题和坐标类型设置。最后,对百度地图SDK的文档质量提出了批评。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在百度那里注册成为开发者,创建对应的应用,填写包名,sha1,最后得到AK。
2.下载sdk,解压得到jar包,和各个平台的so库。
3.由于我是组件化开发,将jar包和各个平台的so库目录复制到common的libs目录下,右击jar包,add as library。common的build.gradle就多此jar的引用。

//这里是common模块,使用api,而不是implementation
 api files('libs/BaiduLBS_Android.jar')

4.在app的AndroidManifest.xml下加以下内容

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <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" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="你应用的AK" />
        <service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>

5.在application中初始化sdk

        SDKInitializer.initialize(application);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);

6.地图控件如下

    <com.baidu.mapapi.map.MapView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/map_id"
        android:clickable="true"
        android:layout_below="@+id/position_linear"
        />

7.定位

                        baiduMap = map_id.map
                        baiduMap.mapType = BaiduMap.MAP_TYPE_NORMAL
                        baiduMap.isMyLocationEnabled = true
                        baiduMap.setIndoorEnable(true)
                        //室内室外
                        baiduMap.setOnBaseIndoorMapListener(object :BaiduMap.OnBaseIndoorMapListener{
                            override fun onBaseIndoorMapMode(
                                p0: Boolean,
                                p1: MapBaseIndoorMapInfo?
                            ) {
                                if(p0){
                                    Log.d("position","室内")
                                }else{
                                    Log.d("position","室外")
                                }
                            }

                        })
                        //定位
                        mLocationClient = LocationClient(this@Login)
                        val option = LocationClientOption()
                        option.setOpenGps(true) // 打开gps
                        option.setCoorType("bd09ll") // 设置坐标类型
                        option.addrType = "all"
                        option.setScanSpan(1000)
                        mLocationClient.setLocOption(option)
                        mLocationClient.registerLocationListener(object :BDAbstractLocationListener(){
                            override fun onReceiveLocation(location: BDLocation?) {
                                if (location == null || baiduMap == null) {
                                    return
                                }
                                val locData: MyLocationData = MyLocationData.Builder()
                                    .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360
                                    .direction(location.getDirection())
                                    .latitude(location.getLatitude())
                                    .longitude(location.getLongitude())
                                    .build()
                                if(isFirst){
                                    //如果不改为false则每一秒都会中心定位到移动到当前位置
                                    isFirst = false
                                    var latLng = LatLng(location.latitude,location.longitude)
                                    baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(latLng))
                                }
                                baiduMap.setMyLocationData(locData)
                                var stringBuilder =  StringBuilder()
                                stringBuilder.append("\n经度:" + location.getLatitude())
                                stringBuilder.append("\n纬度:"+ location.getLongitude())
                                stringBuilder.append("\n状态码:"+ location.getLocType())
                                stringBuilder.append("\n国家:" + location.getCountry())
                                stringBuilder.append("\n城市:"+ location.getCity())
                                stringBuilder.append("\n区:" + location.getDistrict())
                                stringBuilder.append("\n街道:" + location.getStreet())
                                stringBuilder.append("\n地址:" + location.getAddrStr())
                                Log.d("location","detail:"+stringBuilder.toString())
                                city_id.text = location.city
                        //运动轨迹描绘
                                if(isFirstPoint){
                                    currentPoint = LatLng(location.latitude,location.longitude)
                                    isFirstPoint = false
                                }else{
                                    var points = ArrayList<LatLng>()
                                    var p2 = LatLng(location.latitude,location.longitude)
                                    points.add(currentPoint)
                                    points.add(p2)
                                    var overOption =
                                        PolylineOptions()
                                            .width(10)
                                            .color(0xAAFF0000.toInt())
                                            .points(points)
                                    baiduMap.addOverlay(overOption)
                                    currentPoint = p2

                                }


                            }

                        })
                        mLocationClient.start()

注意事项:
(1)如果没有获得需要的权限就执行,会得到蓝色的背图的。
(2)如果没有 option.addrType = “all” 只能获得经纬度,无法获得国家城市等 更加详细的信息。
(3)定位要加上以下代码,不然无法定位,后面如果要定位,只需isFirst改为true即可。

 var latLng = LatLng(location.latitude,location.longitude)
baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(latLng))

顺便吐槽,百度地图sdk开发文档写得是真的烂,和腾讯有得一比。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值