项目里经常要用到定位功能,每次使用初始化实在有些麻烦,这里就做一个简单的封装以便日后其他项目调用,直接上代码。
/**
* class_name: LocationHelper
* describe: 百度定位SDK封装
* create_user: BzCoder
* create_date: 2018/4/2
* create_time: 23:45
**/
public class LocationHelper {
private static LocationHelper helper;
private LocationClient mLocClient;
private BDLocation mBdLocation;
private Context mContext;
private onGetLoc mListener;
public static LocationHelper getInstance(Context context) {
if (helper == null) {
helper = new LocationHelper(context);
}
return helper;
}
public LocationHelper(Context context) {
initLocation(context);
mContext = context;
}
private void initLocation(Context context) {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll"); // 设置坐标类型 可选,默认gcj02,设置返回的定位结果坐标系
option.setScanSpan(1000 * 10);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
//option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
//option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
//option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
//option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
BDLocationListener myListener = bdLocation -> {
if (mListener != null) {
mListener.handleLocData(bdLocation);
}
mBdLocation = bdLocation;
stopClient();
//定位成功后停止定位
};
mLocClient = new LocationClient(context);
mLocClient.registerLocationListener(myListener);
//可选,设置是否需要地址信息,默认不需要
mLocClient.setLocOption(option);
}
public interface onGetLoc {
void handleLocData(BDLocation bdLocation);
}
public BDLocation getBdLocation() {
return mBdLocation;
}
public void startClient() {
int permissionCheck = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION);
if (permissionCheck == PackageManager.PERMISSION_GRANTED && mBdLocation == null) {
mLocClient.start();
} else {
//ToastUtil.show(mContext, "目前手机定位未开启", Toast.LENGTH_LONG);
}
}
public void setListener(onGetLoc mListener) {
this.mListener = mListener;
}
public void stopClient() {
if (null != mLocClient) {
mLocClient.stop();
}
}
}
在程序中使用只需要
LocationHelper helper = LocationHelper.getInstance(this);
//helper.setmListener(bdLocation -> { });//设置回调
helper.startClient();
位置讯息获取成功后,就停止定位。再次取得可以通过helper.getBdLocation()直接获取。当然获取之前不要忘记判断NULL。如果觉得好用或者有问题疑问都欢迎留言。谢谢!
网友评论