Android关于百度地图SDK遇到的问题、以及一些常用方法总结

前言:说实话,自己独立开发的话还是有难度的,很多服务上线需要付费。

1. 关于 WalkNavigateHelper 或者 BickNavigateHelper不存在的问题

原因:没有添加关于步行和骑行依赖。

如果刚开始做,就按照百度指引来,先下载定位+基础+其他。
这里只说添加步行的so+jar包引起的问题。
在这里插入图片描述

assets目录下的jpg放到相应的工程目录。(下面截图有)
在这里插入图片描述

(这步很关键)重新导入.jar的文件(最好改个名字导进去,避免和之前的重复)

在这里插入图片描述

最后添加依赖

  implementation files('src\\main\\jniLibs\\BaiduLBS_Android.jar')
  //这里是自己copy path 下的路径

-------------------------------------完成-----------------------------------

2.关于 WalkNaviLaunchParam().stPt(startPt).endPt(endPt);的弃用问题

更改后的方法

param = new WalkNaviLaunchParam().endNodeInfo(end).startNodeInfo(start);

参数设定(start与end创建一样,都需要一个WalkRouteNodeInfo实体)
这里用setLocation方法传入LatLng对象即可。
这里的latitude, longitude的值作为演示

WalkRouteNodeInfo end = new WalkRouteNodeInfo();
        Double latitude = Double.valueOf(readInfoBySharedPreference("latitude"));
        Double longitude = Double.valueOf(readInfoBySharedPreference("longitude"));
        end.setLocation(new LatLng(park_latitude, park_longitude));

最后param的设定一样。

 WalkNavigateHelper.getInstance().routePlanWithRouteNode(param, new IWRoutePlanListener() {

-----------------------------------完成------------------------------------------------

3.关于在Baidu.Map上显示其他按钮的问题

将百度地图容器放在RelativeLayout下最前面,然后再添加自己的按钮。切记地图一定得放在最前面。

-----------------------------------完成------------------------------------------------

4.关于百度地图自定义陀螺仪的使用

详细 请看:

http://blog.csdn.net/lmj623565791/article/details/37730469

1.记得在Activity create 方法初始化
start中调用监听器start方法
2.BDlistener中的direction 的参数定义为全局变量

 //地图监听器
    private class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
 			MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    .direction(mXDirection) //这个参数
                    .latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude())
                    .build();
            mCurrentAccuracy = bdLocation.getRadius();
            mRadius = bdLocation.getRadius();
            mCurrentLatitude = bdLocation.getLatitude();
            mCurrentLongitude = bdLocation.getLongitude();
}

3.在方向监听中赋值变量

 private void initOritationListener() {
        myOrientationListener = new MyOrientationListener(
                getApplicationContext());
        myOrientationListener
                .setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
                    @Override
                    public void onOrientationChanged(float x) {
                        mXDirection = (int) x;

                        // 构造定位数据
                        MyLocationData locData = new MyLocationData.Builder()
                                .accuracy(mCurrentAccuracy)
                                // 此处设置开发者获取到的方向信息,顺时针0-360
                                .direction(mXDirection)
                                .latitude(mCurrentLatitude)
                                .longitude(mCurrentLongitude).build();
                        // 设置定位数据
                        mBaiduMap.setMyLocationData(locData);
                        // 设置自定义图标
                        
                        setConfiguration();
                    }
                });
    }
 private void setConfiguration() {
            configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL,
                    true, null);
            isFreeMode = false;
        mBaiduMap.setMyLocationConfiguration(configuration);
    }

4.Activity 的stop方法调用

  myOrientationListener.stop();

--------------------------------------完成---------------------------------------------

5.关于创建步行导航时View空指针的问题:

 mNaviHelper = WalkNavigateHelper.getInstance();
  View view = mNaviHelper.onCreate(WNaviGuideActivity.this);

!!终于解决了。办法:更改sdk版本目前(2021.3.21)在26-18都是可以的。

在找问题的时候,发现模拟机上能开启步行导航,而真机上运行会报如下错误:在这里插入图片描述
空指针异常???
然后在询问一个有项目经历的师兄,回答是一般是版本错误。

Android Q(10.0) 版本并不兼容百度SDK 。

看了百度更新日志上:
在这里插入图片描述
目前只适配到7.2.0
在这里插入图片描述

所以在build.gradle(Module)更改开发版本SDK版本为26-28即可:

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.a3_13"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

-----------------------------------------完成------------------------------------------

6.Mask靠近自己的位置时点击、拖拽移动无效

这是百度底层的问题,只能在缩放级别小的时候才可以点击、拖拽。
在这里插入图片描述

刚开始设定放大级别<=18时点击事件会触发。

    //设置定位缩放级别
        MapStatus.Builder builder = new MapStatus.Builder();
        builder.zoom(18.0f);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));

寻找问题:起初我觉得可能是marker的问题,然后我把自定义的marker改成百度地图自带的,仍然没有解决问题,于是就把这个问题搁置了,现在问题解决了。
如上图,18级以上的视角处于定位图层,蓝圈的覆盖marker的点击事件。

博主写工单给百度地图内部人员后,得到一下的回复:
在这里插入图片描述

mBaiduMap.setLayerClickable(MapLayer.MAP_LAYER_LOCATION, false);

特别注意的是!将此代码插入到添加定位点之后,否则会NPE。

//设置定位的参数 
mLocationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //设置地图经纬度的方式(一共有三种类型)
        mLocationClientOption.setCoorType("bd09ll");
        mLocationClientOption.setScanSpan(1000);
        mLocationClientOption.setOpenGps(true);
        mLocationClientOption.setLocationNotify(true);
        mLocationClientOption.setIgnoreKillProcess(false);
        mLocationClientOption.setWifiCacheTimeOut(5 * 60 * 1000);
        //设置自动偏移
        mLocationClientOption.setNeedDeviceDirect(true);
        //设置获取详细信息
        mLocationClientOption.setIsNeedLocationDescribe(true);
 mLocationClient.setLocOption(mLocationClientOption);
 
 //在这
mBaiduMap.setLayerClickable(MapLayer.MAP_LAYER_LOCATION, false);


然后推荐大家使用拖拽地图的方法放置marker(类似于嘀嘀打车中的方式),百度的demo如下:

http://lbsyun.baidu.com/index.php?title=%E5%9C%B0%E5%9B%BE%E9%80%89%E7%82%B9


-----------------------------------------完成------------------------------------------

7.百度AR步行导航、室内导航无法开启问题

搞了好久这个问题,今天算是知道为什么了。
看看百度的工单回复吧:

在这里插入图片描述

看到了吧,百度不会让你太舒服的用它的sdk的!但是它在damo里又不说明这个是付费商品…唉

\

8.百度地图逆地理编码GET请求错误(200)的问题(目前只有间接的办法)


目前还没找到合适的方法直接解决问题,如果小伙伴们有解决办法,欢迎留言!!!


百度给出的答复是自己的应用在发布时包名更改,导致ak只能匹配之前的应用的关系,但是我的app没有更改包报名。
现在的办法是直接调用百度封装好的内部类来解决

方法1:

 Geocoder geocoder = new Geocoder(getApplicationContext());
        try {
            List<Address> fromLocation = geocoder.getFromLocation(latitude, longitude, 30);
            Log.d(TAG, "getLocationInfo: ----latitude"+latitude+"------longitude-----"+longitude);
            Log.d(TAG, "onReceiveLocation: ---------------->"+fromLocation);
        } catch (IOException e) {
            e.printStackTrace();
        }


用过可能发现,这个地址传进去之后,内部会经行处理,所以只能接近我们想要的地方的信息但是不能完全契合。

方法2:

这个就特别精准了,不过得勾选 检索的jar包
在这里插入图片描述
至于之前没有勾选的,只能去重下所有jar包,然后重新配置了(重新配置有问题的去看我的第一条吧),应为单独的检索包内会出现和之前包重复的a类,编译时会报错。或者你会去重就不用这一步了!

我们用到的时GeoCoder类

GeoCoder geoCoder = GeoCoder.newInstance();

然后使用反编译器

 geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
//这个回调则可以获得一些国家、地区、街道等信息
            }

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                sematicDescription = reverseGeoCodeResult.getSematicDescription();
                //这里就是我们需要的详细地点信息,超详细。
                //当然,你也可以获取周边商场、简单的地理信息、所在的地理位置
            }
        });
        ReverseGeoCodeOption geoOption = new ReverseGeoCodeOption();
        geoOption.location(new LatLng(getParkingLatitudeFromSp(),getParkingLongitudeFromSp()));
        boolean b = geoCoder.reverseGeoCode(geoOption);

文档:具体想要的,你可以点这看文档,全中文很方便。
快去试试看吧!!

-------------------------------------------完成----------------------------------------

9.InfoWindow 的显示错误问题

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
......>
............
</LinierLayout>

将所有容器改写成包裹内容即可
---------------------------------------------完成--------------------------------------

10.解决百度地图在真机上用不了导航,模拟机可以的问题。

大部分原因是你在控制台的SHA1值错了

开发版:
1。打开控制命令符窗口
2.输入 cd .android (默认在这个文件夹下,你要是改了就根据自己的包名来)
3.输入 keytool -list -v -keystore debug.keystore 回车
4.密码一般是:android
5.找到SHA1 粘贴到百度控制台的开发版

发布版
先创建新的APK
1.Android Studio 的 Terminal
2.cd到你的目录下 打开刚刚新建的文件 输入keytool -list -v -keystore
例子: cd L:\APK keytool -list -v -keystore damo.jks
3.找出你的SHA1 粘贴到百度控制台的发布版

---------------------------------------------完成--------------------------------------

11.页面跳转到指定点

(1)跳转到任意点

//position是你想要地图跳转到的位置
//param position  LatLng
 MapStatusUpdate update = MapStatusUpdateFactory
 						.newLatLng(position);
mBaiduMap.setMapStatus(update);

(2)打开地图页面后跳转到“我的位置”

 private class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
  //第一次定位,提示位置
            if (isFirstLocate == true) {
                String locationDescribe = bdLocation.getLocationDescribe();
                makeToast("您在:" + locationDescribe);
                LatLng ll = new LatLng(bdLocation.getLatitude(),
                        bdLocation.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);
                isFirstLocate = false;
            }
       }
 }

---------------------------------------------完成--------------------------------------

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L-->R

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值