Api下载地址:http://lbsyun.baidu.com/
自己注册账号下载好api在控制台创建好自己的应用程序 获得到ak值
(AS中SHA1获取方式:点击右侧的gradle,选择你的项目,双击signingReport,sha1码和md5码都会在as的控制台输出,自行分辨debug,和release版本)

第一步:在build.gradle(module:app)中添加引用
在工程app/libs目录下放入BaiduLBS_Android.jar文件,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so文件,放入libBaiduMapSDK_X_vX_X_X.so
注意:Jar文件和so文件的版本号必须一致,并且保证Jar文件与so文件是同一版本包取出的。
在android节点里添加
sourceSets {main {jniLibs.srcDirs = ['libs']}}
dependencies 节点里添加
implementation files('libs/BaiduLBS_Android.jar')
implementation fileTree(include: ['*.jar'], dir: 'libs')
第二步:修改AndroidManifest文件
添加权限:
<!-- 这个权限用于进行网络定位-->
<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节点里声明定位相关信息
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="之前在百度官网申请的AK">
</meta-data>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
第四步: 修改Application文件,注册地图sdk
//声明变量
public Vibrator mVibrator;
//推荐在oncreate中注册sdk
mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
SDKInitializer.initialize(getApplicationContext());
第五步:新建LocationUtil工具类
/**
* @author EraJieZhang
* 百度定位工具
* eg:
* LocationUtil.getInstance().getLocationClient(mActivity, new BDAbstractLocationListener() {
* @Override public void onReceiveLocation(BDLocation location) {
* if (location != null){
* if(LocationUtil.getInstance().inSpectLocation(location)){
* BaseToast.showLongToast(mActivity,"定位成功!");
* onNext();
* }else{
* BaseToast.showLongToast(mActivity,"定位失败!");
* onErrorNext();
* }
* }
* }
* }).start();
* @data 2018/11/13
*/
public class LocationUtil {
private static final String TAG = "LocationUtil";
private static final int LOCAION_SUCCESS = 161;
/**
* 唯一单例模式
* @return LocationUtil 实例对象
*/
private static LocationUtil mInstance;
private LocationClient mLocationClient = null;
private LocationClientOption mOption;
public synchronized static LocationUtil getInstance() {
if (mInstance == null) {
mInstance = new LocationUtil();
}
return mInstance;
}
/**
* 注册定位,获取定位对象的实例
* @param context 上下文
* @param listener 回掉事件
*/
public LocationClient getLocationClient(Context context, BDAbstractLocationListener listener) {
mLocationClient = new LocationClient(context);
/*声明LocationClient类*/
mLocationClient.registerLocationListener(listener);
setOption();
return mLocationClient;
}
/**
* 设置定位参数
*/
private void setOption() {
if (mOption == null) {
mOption = new LocationClientOption();
/*可选,默认高精度,设置定位模式,高精度,低功耗,仅设备*/
mOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
/*可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;*/
mOption.setCoorType("bd09ll");
/*可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的*/
mOption.setScanSpan(0);
/*可选,设置是否需要地址信息,默认不需要*/
mOption.setIsNeedAddress(true);
/*可选,设置是否需要地址描述*/
mOption.setIsNeedLocationDescribe(true);
/*可选,设置是否需要设备方向结果*/
mOption.setNeedDeviceDirect(true);
/*可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果*/
mOption.setLocationNotify(false);
/*可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死*/
mOption.setIgnoreKillProcess(true);
/*可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”*/
mOption.setIsNeedLocationDescribe(true);
/*可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到*/
mOption.setIsNeedLocationPoiList(true);
/*可选,默认false,设置是否收集CRASH信息,默认收集*/
mOption.SetIgnoreCacheException(false);
/*可选,默认false,设置是否开启Gps定位*/
mOption.setOpenGps(true);
/*可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用*/
mOption.setIsNeedAltitude(false);
}
mLocationClient.setLocOption(mOption);
}
/**
* 检查定位点数据
* @param location location对象
* @return 数据是否合法{true:合法,false:不合法}
*/
public boolean inSpectLocation(BDLocation location) {
boolean isresult = true;
/*获取纬度信息*/
double latitude = location.getLatitude();
/*获取经度信息*/
double longitude = location.getLongitude();
/*获取定位精度,默认值为0.0f*/
float radius = location.getRadius();
String coorType = location.getCoorType();
/*获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准*/
int typeCode = location.getLocType();
/*获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明*/
BaseLog.w("纬度信息:" + latitude);
BaseLog.w("经度信息:" + longitude);
BaseLog.w("定位精度:" + radius);
BaseLog.w("坐标类型:" + coorType);
BaseLog.w("错误码:" + typeCode);
if (latitude == Double.MIN_VALUE) {
isresult = false;
BaseLog.e(TAG, "纬度" + Double.MIN_VALUE + "异常");
} else if (longitude == Double.MIN_VALUE) {
isresult = false;
BaseLog.e(TAG, "经度" + Double.MIN_VALUE + "异常");
}
/*
* 61 GPS定位结果,GPS定位成功
* 62 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位
* 63 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位
* 66 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
* 68 网络连接失败时,查找本地离线定位时对应的返回结果
* 161 网络定位结果,网络定位成功
* 162 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件
* 167 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位
* 505 AK不存在或者非法,请按照说明文档重新申请AK
* 按照需求自行判断
* */
if (typeCode != LOCAION_SUCCESS) {
isresult = false;
BaseLog.e(TAG, "返回码异常:errorCode=" + typeCode);
}
BaseLog.e(TAG, "inSpectLocation的返回值:" + isresult);
return isresult;
}
}
getLocationClient 注册定位,获取定位对象的实例,设置回掉方法
setOption(私有可自定义) 设置定位参数
inSpectLocation(可自定义) 检查定位点数据
第六步:新建测试activity
获取mLocationClient 实例
掉用mLocationClient.start();方法开始定位
如果是同步定位的 在回掉方法里调用下一步操作
如果是异步定位的 在start之后调用即可
错误码:
在定位结果BDLocation类中,可通过getLocType方法来获取本次定位的错误返回码。各错误返回码的具体说明如下:
返回值 返回值说明
61 GPS定位结果,GPS定位成功
62 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位
63 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位
66 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
68 网络连接失败时,查找本地离线定位时对应的返回结果
161 网络定位结果,网络定位成功
162 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件
167 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位
505 AK不存在或者非法,请按照说明文档重新申请AK
Android定位SDK自v7.2版本起,在BDAbstractLocationListener中新增onLocDiagnosticMessage方法,用于细化定位失败原因,开发者可以根据具体原因从产品角度提示用户进行相关操作,达到定位成功的目的,也有助于进一步分析定位失败原因。详细说明如下:
locType diagnosticType diagnosticMessage
161 1 NetWork location successful, open gps will be better!
161 2 NetWork location successful, open wifi will be better!
67 3 Offline location failed, please check the net (wifi/cell)!
62 4 Location failed beacuse we can not get any loc information without any location permission!
62 5 Location failed beacuse we can not get any loc information with the phone loc mode is off, you can turn it on and try again!
62 6 Location failed beacuse we can not get any loc information , you can insert a sim card or open wifi and try again!
62 7 Location failed beacuse we can not get any loc information in airplane mode, you can turn it off and try again!
167 8 NetWork location failed because baidu location service can not caculate the location!
62 9 Location failed beacuse we can not get any loc information!
- 如果不能定位,记录错误返回码,并到百度地图开放平台论坛Andriod定位SDK版块中进行交流。
网址:http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10
- 若返回值是162~167,请将错误码、IMEI、定位唯一标识(自v7.2版本起,通过BDLocation.getLocationID方法获取)和定位时间反馈至邮箱loc-bugs@baidu.com,以便我们跟进追查问题。
网友评论