本章为百度地图定位,内容为使用百度地图的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文件;
- 在应用程序创建时初始化SDK引用的Context全局变量。
SDKInitializer.initialize(getApplicationContext());
- 然后重写activity的生命周期的几个方法来管理地图的生命周期。在activity的onResume、onPause、onDestory方法中分别执行mapview的onReusme、onPause、onDestory方法。
- 定位功能主要会用到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();
}
}
好了,这次的安卓百度地图定位就到这了,有任何疑问或出错的地方大家积极在下方评论,那些定位到非洲的小伙伴也记得留言哦。