Android里使用百度地图api

版权声明:转载请说明去处,文章仅供学习参考 https://blog.csdn.net/qq_38487155/article/details/81462435

准备工作:在使用前需要到百度开发者平台申请API Key,这里不多赘述,各位读者可自行查询文章。

一、修改AndroidManifest.xml文件,添加权限和API Key,以下为需要权限(注释部分是因为项目之前有添加过,读者仍需注册)

<!--&lt;!&ndash; 读取权限 &ndash;&gt;-->
    <!--<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_NETWORK_STATE"/>-->
    <!--&lt;!&ndash;//获取设备网络状态,禁用后无法获取网络状态&ndash;&gt;-->
    <!--<uses-permission android:name="android.permission.INTERNET"/>-->
    <!--&lt;!&ndash;//网络权限,当禁用后,无法进行检索等相关业务&ndash;&gt;-->
    <!--<uses-permission android:name="android.permission.READ_PHONE_STATE" />-->
    <!--&lt;!&ndash;//读取设备硬件信息,统计数据&ndash;&gt;-->
    <!--<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />-->
    <!--&lt;!&ndash;//读取系统信息,包含系统版本等信息,用作统计&ndash;&gt;-->
    <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />-->
    <!--&lt;!&ndash;//获取设备的网络状态,鉴权所需网络代理&ndash;&gt;-->
    <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
    <!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!--//获取统计数据-->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!--//鉴权所需该权限获取进程列表-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--//使用步行AR导航,配置Camera权限-->
<application
    ...>
<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="此处填申请到的API Key"
            />
<application>

二、在build.gradle里添加以下代码

android{
sourceSets{
    main{
        jniLibs.srcDir 'libs'
        //说明so的路径为该libs路径,关联所有地图SDK的so文件
    }
}
dependencies {
    implementation files('libs/BaiduLBS_Android.jar')
    compile files('libs/BaiduLBS_Android.jar')
}

三、在项目目录下的libs导入下载好的jar包(需要从百度开发者平台下载):右键jar包点击Add as Library

四、在XML里放置一个MapView地图,在Activity里设置各种参数

<com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
public class MapActivity extends Activity {
    BaiduMap mBaiduMap;//定义地图实例
    MapView mMapView;
    public LocationClient mLocationClient = null;//定义LocationClient
    private MyLocationListener myListener = new MyLocationListener();//继承BDAbstractLocationListener的class
    boolean ifFrist = true;//判断是否是第一次进去
    class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            double latitude = location.getLatitude();    //获取纬度信息
            double longitude = location.getLongitude();    //获取经度信息
            float radius = location.getRadius();    //获取定位精度,默认值为0.0f

            String coorType = location.getCoorType();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准

            int errorCode = location.getLocType();
            Log.i("---------", location.getCityCode() + "---" + latitude + "--" + longitude + "----" + coorType + "--" + location.getCountry() + "--" + location.getCity() + "--" + location.getAddrStr());
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明

            // 构造定位数据
	        MyLocationData locData = new MyLocationData.Builder()
	                .accuracy(location.getRadius())
	                // 此处设置开发者获取到的方向信息,顺时针0-360
	                .direction(100).latitude(location.getLatitude())
	                .longitude(location.getLongitude()).build();

	        // 设置定位数据
	        mBaiduMap.setMyLocationData(locData);

            if (ifFrist) {
                MapStatusUpdate update = MapStatusUpdateFactory.zoomBy(5f);
                // 放大
                mBaiduMap.animateMapStatus(update);
                // 显示个人位置,定位数据建造器
                MyLocationData.Builder builder = new MyLocationData.Builder();
                builder.latitude(location.getLatitude());
                builder.longitude(location.getLongitude());
                MyLocationData data = builder.build();
                mBaiduMap.setMyLocationData(data);
                ifFrist = false;
            }
        }
    }
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());

        setContentView( R.layout.maplayout);
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();//获取地图实例对象
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        //设置定位图标,第二个参数设置是否有箭头,第三个设置图标样式
        //mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, false,null));
        mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, false, null));


        //声明LocationClient类
        mLocationClient = new LocationClient(getApplicationContext());
        //注册监听函数
        mLocationClient.registerLocationListener(myListener);

        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选,设置定位模式,默认高精度
        //LocationMode.Hight_Accuracy:高精度;
        //LocationMode. Battery_Saving:低功耗;
        //LocationMode. Device_Sensors:仅使用设备;

        option.setCoorType("bd09ll");
        //可选,设置返回经纬度坐标类型,默认gcj02
        //gcj02:国测局坐标;
        //bd09ll:百度经纬度坐标;
        //bd09:百度墨卡托坐标;
        //海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标

        option.setScanSpan(10000);
        //可选,设置发起定位请求的间隔,int类型,单位ms
        //如果设置为0,则代表单次定位,即仅定位一次,默认为0
        //如果设置非0,需设置1000ms以上才有效

        option.setOpenGps(true);
        //可选,设置是否使用gps,默认false
        //使用高精度和仅用设备两种定位模式的,参数必须设置为true

        option.setLocationNotify(true);
        //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false

        option.setIgnoreKillProcess(false);
        //可选,定位SDK内部是一个service,并放到了独立进程。
        //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)

        option.SetIgnoreCacheException(false);
        //可选,设置是否收集Crash信息,默认收集,即参数为false

        option.setWifiCacheTimeOut(5 * 60 * 1000);
        //可选,7.2版本新增能力
        //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位

        option.setEnableSimulateGps(false);
        //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
        option.setIsNeedAddress(true);

        //传入位置客户端设置好的位置客户端选项
        mLocationClient.setLocOption(option);
        //调用LocationClient的start()方法,便可发起定位请求
        mLocationClient.start();

    }
    protected void onStop() {
        super.onStop();
    }
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
        mLocationClient.stop();
        // 关闭定位图层
        mBaiduMap.setMyLocationEnabled(false);

    }
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
        //调用LocationClient的start()方法,便可发起定位请求
        mLocationClient.start();
    }
}

已经申请过api key的读者可在百度开发者网站修改包名(需要与文件build.gradle中defaultConfig的applicationId一致),后按上述流程走一遍即可

猜你喜欢

转载自blog.csdn.net/qq_38487155/article/details/81462435
今日推荐