简单按步骤即可实现定位功能:
1.下载百度地图SDK基础定位
将SO文件的压缩文件解压出来,把对应架构下的SO文件放入开发者自己APP的对应架构下的文件夹中(建议全部放入以提高程序兼容性);将JAR文件拷贝到工程的libs目录下,这样即可在程序中使用Android定位SDK。
在build.gradle中配置SO文件的使用,如下所示:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
2.设置AndroidManifest.xml
声明使用权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
在Application标签中声明SERVICE组件并添加百度密钥
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="PUNGOv0mnOPLjCl04XAwK4CsbGPOjsa4" /> //key:开发者申请的Key(填写自己申请的key)
3.下面是封装好的百度定位的工具类
/**
* 百度地图定位工具类
*
* @author LiuFeng
* @date 2017-7-22
*/
public class BdLocationUtil {
/**
* 单例
*
* @return
*/
public static BdLocationUtil getInstance() {
return LocationHolder.INSTANCE;
}
private static class LocationHolder {
private static final BdLocationUtil INSTANCE = new BdLocationUtil();
}
private BdLocationUtil() {
}
/**
* 定位回调的接口
*/
public interface MyLocationListener {
void myLocation(BDLocation location);
}
/**
* 获取当前位置
*/
public void requestLocation(final MyLocationListener listener) {
//声明LocationClient类
final LocationClient locationClient = new LocationClient(App.getContext());
// 设置定位条件
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 是否打开GPS
option.setCoorType("bd09ll"); // 设置返回值的坐标类型
option.setScanSpan(10000); // 设置定时定位的时间间隔。单位毫秒
option.setIsNeedAddress(true); //可选,设置是否需要地址信息,默认不需要
option.setIgnoreKillProcess(false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
locationClient.setLocOption(option);
// 注册位置监听器
locationClient.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
listener.myLocation(location);
locationClient.stop();
}
});
locationClient.start();
/*
* 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation(
* )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
* 返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
* 定时定位时,调用一次requestLocation,会定时监听到定位结果。
*/
locationClient.requestLocation();
}
}
4.将以下代码放入需要定位的Activity中,在onCreate()方法中调用myPermissionRequest()方法即可,以上工作准备好就可以使用啦
/**
* 动态请求权限,安卓手机版本在5.0以上时需要
*/
private void myPermissionRequest() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查是否拥有权限,申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION
}, BAIDU_ACCESS_COARSE_LOCATION);
}
else {
// 已拥有权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
myLocation();
}
}else {
// 安卓手机版本在5.0时,配置清单中已申明权限,作相应处理,此处正对sdk版本低于23的手机
myLocation();
}
}
/**
* 百度地图定位的请求方法 拿到 国 省 市 区
*/
private void myLocation() {
BdLocationUtil.getInstance().requestLocation(new BdLocationUtil.MyLocationListener() {
@Override
public void myLocation(BDLocation location) {
if (location == null) {
return;
}
if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
String mCounty = location.getCountry(); //获取国家
String mProvince = location.getProvince(); //获取省份
String mCity = location.getCity(); //获取城市
String mDistrict = location.getDistrict(); //获取区
Log.i("==requestLocation===", "myLocation: "+mCounty+"="+mProvince+"="+mCity+"="+mDistrict);
}
}
});
}
/**
* 权限请求的返回结果
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// requestCode即所声明的权限获取码,在checkSelfPermission时传入
case BAIDU_ACCESS_COARSE_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 第一次获取到权限,请求定位
myLocation();
}
else {
// 没有获取到权限,做特殊处理
Log.i("=========", "请求权限失败");
}
break;
default:
break;
}
}
是不是特别简单啊,完成啦啦啦···
网友评论