Android开发之百度地图定位

本章为百度地图定位,内容为使用百度地图的sdk,实现对自己当前位置的定位。

  • 申请AK
  • 下载SDK开发包
  • 在android项目中引用百度SDK
  • 实现定位

先摆上运行后的图:
在这里插入图片描述
没错,这肯定不是我运行后的图,是我随便找的一张网图嘿嘿。只是说会是这种形式定位自己。据说许多小伙伴运行后会定位到非洲,遇到这种情况的赶紧到下方评论区留名,让我嘴角忍不住上扬。建议大家用真机测试,就是自己手机。

大家先使用Android Studio创建一个empty activity;

一、申请AK

要想使用百度地图sdk,就必须申请一个百度地图的api key。

① 打开网址http://lbsyun.baidu.com/apiconsole/key,里面需要你注册的就注册注册成为百度的开发者。

②创建应用
在这里插入图片描述
点击创建应用:
在这里插入图片描述
关于SHA1的获取:

  • 打开Android Studio;
  • 点击底部的Terminal;
  • 找到你的.Android目录:(一般在C:\Users\Administrator.android);
  • 在Terminal输入下面命令:
keytool -list -v -keystore debug.keystore -alias androiddebugkey

出现下面情况直接回车;在这里插入图片描述
找到SHA1填入;(提示格式不对是因为你复制内容的最前面或最后面有空格)
包名:就是你构建项目的包名,可以在项目的AndroidMainfest.xml查看package。

完成上面步骤后,ak就自动生成了:
在这里插入图片描述

二、下载SDK开发包

选择下面网址进行自定义下载:
http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download

在这里插入图片描述
暂时我们只需要基础定位,其他的大家也可以根据需求勾选下载。

三、在android项目中引用百度SDK

1、将开发包中的jar包和so文件添加到libs文件下。

我们将解压后的文件libs直接托到下图的app下,替换原来空的libs;只有一个BaiduLBS_Android.jar包。
在这里插入图片描述
在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:

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

然后我们需要将jar包导入项目:
点击File->project structure到下图界面:选择Dependence和app
在这里插入图片描述
点击红色箭头的 ‘+’,下方有个import Jar导入jar包,路径选择自己刚才替换libs的目录下面。

导jar包完成后,我们可以在app目录下的build.gradle中查看是否导入成功:
在这里插入图片描述

现在我们的应用中已经集成了百度地图SDK,当我们在打包混淆的时候需要注意于BaiduMap SDK 相关的内容不应该被混淆,所以我们需要配置混淆文件。

1.打开app目录下的build.gradle文件,在release代码块中添加如下内容(也可能Android Studio已自动生成)
在这里插入图片描述
2.编写混淆文件,打开app目录下的proguard-rules.pro文件,添加如下代码。

-keep class com.baidu.** {*;}
-keep class mapsdkvi.com.** {*;}    
-dontwarn com.baidu.**
2、配置AndroidManifest.xml

内容在代码处有注释:关于授权,可能没用到的,我也一并声明了

 	<!-- 这个权限用于进行网络定位-->
    <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.WRITE_EXTERNAL_STORAGE"/>
    <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 允许挂载和反挂载文件系统可移动存储 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <!-- 允许程序读取底层系统日志文件 -->
    <uses-permission android:name="android.permission.READ_LOGS"
        tools:ignore="ProtectedPermissions" />
    <!-- 允许访问振动设备 -->
    <uses-permission android:name="android.permission.VIBRATE"/>
    <!-- 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失 -->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <!-- 允许程序读取或写入系统设置 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <!-- android 9.0上使用前台服务,需要添加权限 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 读取缓存数据 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 获取模拟定位信息 -->


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- 声明service组件 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>

        <!-- AK鉴权 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="YB5k1UuPfS41uikoflUqfG7jYleNgLdU" />

        <activity android:name=".MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
3、在layout中添加百度地图控件
<com.baidu.mapapi.map.MapView
        android:id="@+id/bmapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:focusable="true" />

四、实现定位

进入我们的MainActivity.java文件;

  1. 在应用程序创建时初始化SDK引用的Context全局变量。
SDKInitializer.initialize(getApplicationContext());
  1. 然后重写activity的生命周期的几个方法来管理地图的生命周期。在activity的onResume、onPause、onDestory方法中分别执行mapview的onReusme、onPause、onDestory方法。
  2. 定位功能主要会用到LocationClient、BDLocationListener、BDNotifyListener、LocationClientOption等类。
    (1)初始化LocationClient类:
    LocationClient类是定位SDK的核心类,必须在主线程中声明。需要传入一个Context类型的参数,推荐使用getApplicationContext()来获取全局进程有效的context。
    (2)设置定位参数:
    主要的参数有:定位模式、返回坐标类型、是否打开GPS等。
    定位模式分为三种:
    ① 高精度定位模式:同时使用网络定位和GPS定位,优先返回最高精度的定位结果。
    ② 低功耗定位模式:不使用GPS,只使用网络定位(WiFi和基站)。
    ③ 仅用设备定位模式: 不适用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。
    (3)设置定位监听函数
public BDLocationListener myListener = new BDLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation location) {
        }
}

(4)设置定位函数

  private void setLocationOption() {}

最后给上MainActivity.java完整代码(按alt+enter导入相关类,对于gradle文件同步,我们要按下下图键:)
在这里插入图片描述

public class MainActivity extends Activity {
        // 百度地图控件  
        private MapView mapView = null;
         // 定位相关声明
        public LocationClient locationClient = null;
        //自定义图标
        BitmapDescriptor mCurrentMarker = null;
        boolean isFirstLoc = true;// 是否首次定位

        BaiduMap baiduMap;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            //
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.activity_main);
            mapView = findViewById(R.id.bmapview);
            // 百度地图对象  
            baiduMap = mapView.getMap();
            baiduMap.setMyLocationEnabled(true);

            locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类
            locationClient.registerLocationListener(myListener); // 注册监听函数
            this.setLocationOption();   //设置定位参数
            locationClient.start(); // 开始定位
        }

        //设置定位函数
        private void setLocationOption() {
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开GPS
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式
            option.setCoorType("bd09ll"); // 返回的定位结果是百度经纬度,默认值gcj02
            option.setScanSpan(5000); // 设置发起定位请求的间隔时间为5000ms
            option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
            option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向
            locationClient.setLocOption(option);
        }

        //定义响应函数
        public BDLocationListener myListener = new BDLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation location) {
                // map view 销毁后不在处理新接收的位置
                if (location == null || mapView == null)
                    return;

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

                if (isFirstLoc) {
                    isFirstLoc = false;

                    LatLng ll = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16);   //设置地图中心点以及缩放级别
                    baiduMap.animateMapStatus(u);
                }
            }
        };

        @Override
        protected void onResume() {
            super.onResume();
            mapView.onResume();
        }
        @Override
        protected void onPause() {
            super.onPause();
            mapView.onPause();
        }
        @Override
        protected void onDestroy() {
            mapView.onDestroy();
            mapView = null;
            super.onDestroy();
        }
}

好了,这次的安卓百度地图定位就到这了,有任何疑问或出错的地方大家积极在下方评论,那些定位到非洲的小伙伴也记得留言哦。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值