packagecom.jiahao.baidulocation;
importandroid.content.Context;
importandroid.os.Handler;
importandroid.os.Looper;
importandroid.util.Log;
importcom.baidu.location.BDLocation;
importcom.baidu.location.BDLocationListener;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;
importcom.baidu.location.Poi;
importjava.util.List;
/**
* Created by Administrator on 2017/5/25.
*/
public classBaiduLocationManager {
private staticBaiduLocationManagermInstance;
privateLocationClientlocationClient;
private staticBDLocationListenermyListener;
privateLocationBeanmLocationBean;
privateHandlermHandler;
privateonLocationListenermLocationListener;
privateBaiduLocationManager(Context context){
//聲明LocationClient類
locationClient=newLocationClient(context);
//注冊(cè)監(jiān)聽函數(shù)
myListener=newMyLocationListener();
locationClient.registerLocationListener(myListener);
mHandler=newHandler(Looper.getMainLooper());
}
public staticBaiduLocationManager getInstance(Context context){
if(mInstance==null&&myListener==null){
mInstance=newBaiduLocationManager(context);
}
returnmInstance;
}
private classMyLocationListenerimplementsBDLocationListener {
@Override
public voidonReceiveLocation(BDLocation location) {
mLocationBean=newLocationBean();
//獲取定位結(jié)果
StringBuffer sb =newStringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());//獲取定位時(shí)間
mLocationBean.setLocationTime(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());//獲取類型類型
sb.append("\nlatitude : ");
sb.append(location.getLatitude());//獲取緯度信息
mLocationBean.setLocationLatitude(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());//獲取經(jīng)度信息
mLocationBean.setLocationLongitude(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());//獲取定位精準(zhǔn)度
if(location.getLocType() == BDLocation.TypeGpsLocation){
// GPS定位結(jié)果
sb.append("\nspeed : ");
sb.append(location.getSpeed());// 單位:公里每小時(shí)
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());//獲取衛(wèi)星數(shù)
sb.append("\nheight : ");
sb.append(location.getAltitude());//獲取海拔高度信息园欣,單位米
sb.append("\ndirection : ");
sb.append(location.getDirection());//獲取方向信息,單位度
sb.append("\naddr : ");
sb.append(location.getAddrStr());//獲取地址信息
mLocationBean.setLocationAddress(location.getAddrStr());
sb.append("\ndescribe : ");
sb.append("gps定位成功");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
// 網(wǎng)絡(luò)定位結(jié)果
sb.append("\naddr : ");
sb.append(location.getAddrStr());//獲取地址信息
mLocationBean.setLocationAddress(location.getAddrStr());
sb.append("\noperationers : ");
sb.append(location.getOperators());//獲取運(yùn)營商信息
sb.append("\ndescribe : ");
sb.append("網(wǎng)絡(luò)定位成功");
}else if(location.getLocType() == BDLocation.TypeOffLineLocation) {
// 離線定位結(jié)果
sb.append("\ndescribe : ");
sb.append("離線定位成功,離線定位結(jié)果也是有效的");
}else if(location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服務(wù)端網(wǎng)絡(luò)定位失敗见咒,可以反饋IMEI號(hào)和大體定位時(shí)間到loc-bugs@baidu.com,會(huì)有人追查原因");
}else if(location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("網(wǎng)絡(luò)不同導(dǎo)致定位失敗,請(qǐng)檢查網(wǎng)絡(luò)是否通暢");
}else if(location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("無法獲取有效定位依據(jù)導(dǎo)致定位失敗坠七,一般是由于手機(jī)的原因见转,處于飛行模式下一般會(huì)造成這種結(jié)果命雀,可以試著重啟手機(jī)");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe());//位置語義化信息
mLocationBean.setLocationDescribe(location.getLocationDescribe());
List list = location.getPoiList();// POI數(shù)據(jù)
if(list !=null) {
sb.append("\npoilist size = : ");
sb.append(list.size());
for(Poi p : list) {
sb.append("\npoi= : ");
sb.append(p.getId() +" "+ p.getName() +" "+ p.getRank());
}
mLocationListener.onSuccess(mLocationBean);
}else{
mLocationListener.onFile();
}
// Log.i("BaiduLocationApiDem", sb.toString());
}
@Override
public voidonConnectHotSpotMessage(String s,inti) {
}
}
/**
* 開始定位
*/
public voidstartBaiduLocation(){
locationClient.start();
initLocation();
}
public voidgetmLocationBean(onLocationListener listener){
this.mLocationListener= listener;
}
/**
* 結(jié)束定位
*/
public voidstopBaiduLocation(){
locationClient.stop();
}
/**
* 設(shè)置參數(shù)
*/
private voidinitLocation(){
LocationClientOption option =newLocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可選,默認(rèn)高精度斩箫,設(shè)置定位模式吏砂,高精度,低功耗乘客,僅設(shè)備
option.setCoorType("bd09ll");
//可選狐血,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系
intspan=1000;
option.setScanSpan(span);
//可選寨典,默認(rèn)0氛雪,即僅定位一次,設(shè)置發(fā)起定位請(qǐng)求的間隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);
//可選耸成,設(shè)置是否需要地址信息报亩,默認(rèn)不需要
option.setOpenGps(true);
//可選,默認(rèn)false,設(shè)置是否使用gps
option.setLocationNotify(true);
//可選井氢,默認(rèn)false弦追,設(shè)置是否當(dāng)GPS有效時(shí)按照1S/1次頻率輸出GPS結(jié)果
option.setIsNeedLocationDescribe(true);
//可選,默認(rèn)false花竞,設(shè)置是否需要位置語義化結(jié)果劲件,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近”
option.setIsNeedLocationPoiList(true);
//可選约急,默認(rèn)false零远,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);
//可選厌蔽,默認(rèn)true牵辣,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程奴饮,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程纬向,默認(rèn)不殺死
option.SetIgnoreCacheException(false);
//可選,默認(rèn)false戴卜,設(shè)置是否收集CRASH信息逾条,默認(rèn)收集
option.setEnableSimulateGps(false);
//可選,默認(rèn)false投剥,設(shè)置是否需要過濾GPS仿真結(jié)果师脂,默認(rèn)需要
locationClient.setLocOption(option);
}
/**
* 自己定義的bean類
*/
public classLocationBean {
//定位時(shí)間
privateStringlocationTime;
//緯度
privateDoublelocationLatitude;
//經(jīng)度
privateDoublelocationLongitude;
//定位位置
privateStringlocationAddress;
//語義化
privateStringlocationDescribe;
publicString getLocationTime() {
returnlocationTime;
}
public voidsetLocationTime(String locationTime) {
this.locationTime= locationTime;
}
publicDouble getLocationLatitude() {
returnlocationLatitude;
}
public voidsetLocationLatitude(Double locationLatitude) {
this.locationLatitude= locationLatitude;
}
publicDouble getLocationLongitude() {
returnlocationLongitude;
}
public voidsetLocationLongitude(Double locationLongitude) {
this.locationLongitude= locationLongitude;
}
publicString getLocationAddress() {
returnlocationAddress;
}
public voidsetLocationAddress(String locationAddress) {
this.locationAddress= locationAddress;
}
publicString getLocationDescribe() {
returnlocationDescribe;
}
public voidsetLocationDescribe(String locationDescribe) {
this.locationDescribe= locationDescribe;
}
@Override
publicString toString() {
return"LocationBean{"+
"locationTime='"+locationTime+'\''+
", locationLatitude="+locationLatitude+
", locationLongitude="+locationLongitude+
", locationAddress='"+locationAddress+'\''+
", locationDescribe='"+locationDescribe+'\''+
'}';
}
}
interfaceonLocationListener{
voidonSuccess(LocationBean locationBean);
voidonFile();
}
}
使用:
packagecom.jiahao.baidulocation;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importcom.baidu.location.BDLocation;
importcom.baidu.location.BDLocationListener;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;
importcom.baidu.location.Poi;
importjava.util.List;
public classMainActivityextendsAppCompatActivity {
privateBaiduLocationManagerbaiduLocationManager;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
baiduLocationManager=? BaiduLocationManager.getInstance(getApplicationContext());
baiduLocationManager.startBaiduLocation();
baiduLocationManager.getmLocationBean(newBaiduLocationManager.onLocationListener() {
@Override
public voidonSuccess(BaiduLocationManager.LocationBean locationBean) {
Log.i("BaiduLocationApiDem", locationBean.toString());
baiduLocationManager.stopBaiduLocation();
}
@Override
public voidonFile() {
Log.i("BaiduLocationApiDem","失敗了");
}
});
}
@Override
protected voidonDestroy() {
super.onDestroy();
baiduLocationManager.stopBaiduLocation();
}
}