Android关于百度地图的开发心得(笔记一(配置与基本使用))

Posted Tobey_r1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android关于百度地图的开发心得(笔记一(配置与基本使用))相关的知识,希望对你有一定的参考价值。

关于

  最近新项目启动在即,想着公司的老项目中地图的使用(百度地图)的sdk已经比较老了,v4.3版本的。我今天去开发平台下载最新的已经是7_2版本了,有必要更新使用并记录。然后会大概有一个小系列记录,上一个系列的记录webview的使用,只写了一和二是因为我直接用了开源库一篇解决开发问题,有想法的可以看WebLoading开源库,支持https访问好了,闲话到此。

使用

第一步,下载sdk

  首先我们到百度开发者平台下载一个Android的sdk,下载页面:,选择我们会使用的如地图、定位然后选择jar,选择开发包下载。然后将下载下来的压缩包解压后的lib中的BaiduLBS_Android.jar添加到我们项目中的lib下,并在lib下新建两个文件夹(armeabi与armeabi-v7a)并将我们下载解压对应文件夹下的内容copy过去:
在这里插入图片描述
  我们还需要把上图中的BaiduLBS_Android.jar右键添加到library中, 在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:

sourceSets {
           main {
               jniLibs.srcDir 'libs'
           }
    }

  还有就是我们定位可能会用到一些图标mark,在V5.1.0后被移除了,所以有需要的话,可以单独下载资源包,有使用的图片我们可以放到assets文件夹下。
地图sdk的混淆如下,需要项目中的build开启混淆才行,minifyEnabled true具体操作这里不做解释了:

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

以下为注意事项

  地图SDK自v4.5.0起支持HTTPS协议,开发者可以通过setHttpsEnable(boolean isEnable);控制是否使用https,V5.3.2版本之前版本默认使用http协议;V5.3.2版本之后(包含)默认使用https协议。
如果使用默认的http协议,android9.0+禁止明文访问,所以会在使用的时候出现:

  W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted

解决办法:

  • 初始化时改用https请求(建议)
  • targetSdkVersion 降到27以下
  • 配置安全文件network_security_config.xml
    配置文件方法:
    首先在res/下新建一个xml文件夹,然后新建一个network_security_config.xml,然后里面键入:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在Androidmanifest配置文件内的application中输入:

android:networkSecurityConfig="@xml/network_security_config"

第二步,申请appkey

  这里我之前遇到一个问题就是,我申请的时候图省事,我只填了正式版(releas)的sha1值,debug版的没填,导致我打的包在调试的时候地图正常使用,打包之后就会出现地图白板问题(这个你们遇到的话大概率就是appkey的问题),然后我们进行申请。
打包之前,我们先把我们的debug的keystore位置定义一下:

  signingConfigs {
        debug {
            storeFile file('F:/2021NewsProject/xxxx/debug.keystore')
            storePassword 'android'
            keyAlias = 'androiddebugkey'
            keyPassword 'android'
        }
    }

我这里首先想把项目的debug和release版本包都打好,然后我用的keytool,没在terminal中操作。这里我在我的java目录下使用的如下:

C:\\Program Files\\Java\\jdk1.8.0_152\\bin

我们首先通过cd到这个文件:

cd C:\\Program Files\\Java\\jdk1.8.0_152\\bin

如下图:
在这里插入图片描述
然后输入:

keytool -list -v -keystore C:\\Users\\Administrator\\.android\\debug.keystore

然后输入默认的android
然后结果如图:
在这里插入图片描述
同样通过输入:

Java\\jdk1.8.0_152\\bin>keytool -list -v -keystore F:\\2021NewsProject\\xxx\\dingyanApp.jks

  输入密码获取到对应sha1值,输入到我们申请key的界面里面,然后输入包名,提交将我们创建应用获取到的appkey输入到androidmanifest.xml文件中如下:

  <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="h4FYkr41xxxxxKWBrfo3tXKCvMo8aId" />

  每个人的apikey都是不一样的,添加地图需要的对应权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 用于加快GPS首次定位,可选权限,非必须 -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 

我们还需要定义一个app去继承application,并记得在配置文件中android:name=".App"如下:

public class App extends Application {
   // 这个是我们需要用到的权限组
    //如果设置了target > 28,需要增加这个权限,否则不会弹出"始终允许"这个选择框
    private static final String BACK_LOCATION_PERMISSION = "android.permission.ACCESS_BACKGROUND_LOCATION";
    public static final String[] ARR_NEED_PERMISSIONS = new ArrayList<String>() {
        {
            add(Manifest.permission.ACCESS_COARSE_LOCATION);
            add(Manifest.permission.ACCESS_FINE_LOCATION);
            add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            add(Manifest.permission.READ_EXTERNAL_STORAGE);
            add(Manifest.permission.READ_PHONE_STATE);
            if (Build.VERSION.SDK_INT > 28) {
                add(BACK_LOCATION_PERMISSION);        
            }
        }
    }.toArray(new String[0]);

    @Override
    public void onCreate() {
        super.onCreate();

        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
        SDKInitializer.setHttpsEnable(false); //这里是我不使用https,主要https会影响一些效率
    }
}

第三步,修改页面代码

  修改mainactivity.xml:

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

  修改MainActivity.java文件:

   //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        //这个是我用的郭老师的请求框架
        //implementation 'com.permissionx.guolindev:permissionx:1.4.0'
        PermissionX.init(this).permissions(App.ARR_NEED_PERMISSIONS)
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                            initView();
                        }else {

                        }
                    }
                });

  如果成功的话,可以看到如下界面:

在这里插入图片描述
如果不成功的话,可以参考这篇文章对着找下问题,这里我不做赘述。

第四步,定位使用

修改MainActivity.java:

    private MapView mMapView = null;
    private BaiduMap mBaiduMap;
    private LocationClient mLocationClient = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        PermissionX.init(this).permissions(App.ARR_NEED_PERMISSIONS)
                .request(new RequestCallback() {
                    @Override
                    public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) {
                        if (allGranted){
                            initView();
                        }else {

                        }
                    }
                });
    }

    private void initView() {
        if (mBaiduMap == null)
            mBaiduMap = mMapView.getMap();//获取地图实例
        //定义BaiduMapOptions对象
        mMapView.setLogoPosition(LogoPosition.logoPostionRightTop);
        //不显示比例尺
        mMapView.showScaleControl(false);
      //  BaiduMapOptions options = new BaiduMapOptions();
        // 开启定位图层,否则对在地图的设置、绘制定位点将无效
        mBaiduMap.setMyLocationEnabled(true);
       //NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)
        MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, null, 0, 0);
        mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);
        //定位初始化
        mLocationClient = new LocationClient(this);
        //注册LocationListener监听器
        MapStatus.Builder builder = new MapStatus.Builder();
        //设置缩放中心点以及缩放比例
        builder.zoom(18.0f);
        //给地图设置状态
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
        mLocationClient.registerLocationListener(myListener);
        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
      //  option.setCoorType("bd0911");//设置坐标类型
        //默认0,即仅定位一次;设置间隔需大于等于1000ms,表示周期性定位
        option.setScanSpan(3000);
        //默认false,设置是否需要地址信息
        option.setIsNeedAddress(true);
        //默认false,设置是否需要设备方向传感器的方向结果
        option.setNeedDeviceDirect(true);
        //设置locationClientOption
        mLocationClient.setLocOption(option);

        //开启地图定位图层
        mLocationClient.start();
    }

    private BDAbstractLocationListener myListener = new BDAbstractLocationListener(){

        @Override
        public void onReceiveLocation(BDLocation location) {
            if (null != location && location.getLocType() != BDLocation.TypeServerError) {
                if (location == null || mMapView == null){
                    return;
                }         
                MyLocationData locationData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        //此处设置开发者获取到的方向信息,顺时针
                        .direction(location.getDirection())
                        .latitude(location.getLatitude())
                        .longitude(location.getLongitude())
                        .build();
                mBaiduMap.setMyLocationData(locationData);
                //这里得location.getLatitude()与location.getLongitude()就是我们需要的定位信息
   
            }
        }
    };



    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理

    }
    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理

    }
    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mLocationClient.unRegisterLocationListener(myListener);
        mBaiduMap.setMyLocationEnabled(false);

        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理

    }

效果图

在这里插入图片描述
下一篇将会有一些细致得使用。有问题欢迎批评指正!

以上是关于Android关于百度地图的开发心得(笔记一(配置与基本使用))的主要内容,如果未能解决你的问题,请参考以下文章

Android百度地图开发-第一篇:申请搭建百度地图

关于如何在安卓的百度地图开发里面简单实现持续定位

乐卡上海网点地图制作心得 | 百度地图API使用心得

Android 百度地图开发

Android第十四讲笔记(广播,百度地图)

Android开发笔记(一百零三)地图与定位SDK