主要是百度定位以及附近建筑列表
import java.util.ArrayList;
import java.util.List;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult.AddressComponent;
import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener;
import com.baidu.mapapi.search.sug.SuggestionResult;
import com.baidu.mapapi.search.sug.SuggestionSearch;
import com.baidu.mapapi.search.sug.SuggestionSearchOption;
import com.baidu.mapapi.search.sug.SuggestionResult.SuggestionInfo;
/**
*
* 地理位置设置类
*
*/
public class LocationSet implements OnGetGeoCoderResultListener, OnGetSuggestionResultListener{
private static final int TYPE_LOAD_NEARBY = 0;
private Context context;
private LocationClient locationClient;
private SearchLocationListener locationListener;
private LoadNearbyPositionListener loadNearbyPositionListener;
private LoadSuggestionSearchListener loadSuggestionSearchListener;
private GetCrtLatlngListener getCrtLatlngListener;
private GeoCoder geoCoder;
private SuggestionSearch suggestionSearch;
public static LocationSet getInstance(Context context){
return new LocationSet(context);
}
private LocationSet(Context context){
this.context = context;
initLocation();
}
private LocationSet(){
}
private void locate(int type){
if(locationClient != null){
locationListener = new SearchLocationListener(type);
locationClient.registerLocationListener(locationListener);
locationClient.start();
}
}
/**
* init location
*/
private void initLocation(){
locationClient = new LocationClient(context);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd0911");//返回的定位结果是百度经纬度,默认值gcj02
option.setIsNeedAddress(true);
locationClient.setLocOption(option);
}
/**
* init suggest search
*/
private void initSuggestSearch(){
suggestionSearch = SuggestionSearch.newInstance();
suggestionSearch.setOnGetSuggestionResultListener(this);
}
/**
* search location listener
*
*/
private class SearchLocationListener implements BDLocationListener{
private int type = -1;
public SearchLocationListener(int type){
this.type = type;
}
@Override
public void onReceiveLocation(BDLocation location) {
if (location != null) {
/**更新本地经纬度*/
MyApplication.getInstance().setLon(location.getLongitude());
MyApplication.getInstance().setLat(location.getLatitude());
DeviceInfo.saveLocationLat(String.valueOf(location.getLatitude()),context);
DeviceInfo.saveLocationLon(String.valueOf(location.getLongitude()),context);
//更新城市信息
String cityName = location.getCity();
String provinceName = location.getProvince();
String addr = location.getAddrStr();
switch (type) {
case TYPE_LOAD_NEARBY://获取附近位置
if(geoCoder != null){
if(cityName == null || addr == null){//定位失败
//更新搜索状态
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(null);
}
}
else {
geoCoder.geocode(new GeoCodeOption().city(cityName).address(addr));
SharedPreferencesKeeper.writeInfomation(context, -3, cityName);
SharedPreferencesKeeper.writeInfomation(context, -5, provinceName);
}
}
else {
//更新搜索状态
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(null);
}
}
break;
default:
break;
}
}
else {
//更新搜索状态
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(null);
}
}
}
}
/**
* 获取附近位置
*/
public void loadNearByPosition(LoadNearbyPositionListener listener){
loadNearbyPositionListener = listener;
geoCoder = GeoCoder.newInstance();
geoCoder.setOnGetGeoCodeResultListener(this);
//定位当前位置
locate(TYPE_LOAD_NEARBY);
}
/**
* 获取suggestion search
* @param key: 搜索关键字
*/
public void loadSuggestionSearch(String key, LoadSuggestionSearchListener listener){
loadSuggestionSearchListener = listener;
if(suggestionSearch == null){
initSuggestSearch();
}
SuggestionSearchOption searchOption = new SuggestionSearchOption();
searchOption.city(SharedPreferencesKeeper.readInfomation(context, -3));
searchOption.keyword(key);
suggestionSearch.requestSuggestion(searchOption);
}
/**
* 获取经纬度信息
*/
public void getCrtLatLng(String city, String name, GetCrtLatlngListener listener){
getCrtLatlngListener = listener;
geoCoder = GeoCoder.newInstance();
geoCoder.setOnGetGeoCodeResultListener(this);
geoCoder.geocode(new GeoCodeOption().city(city).address(name));
}
/**
*
* 返回位置信息
*/
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(context, "没有搜索到相关位置信息", Toast.LENGTH_SHORT).show();
//更新搜索状态
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(null);
}
if(getCrtLatlngListener != null){
getCrtLatlngListener.getCrtLatlng(null);
}
return;
}
LatLng latLng = result.getLocation();
//获取位置信息
if(loadNearbyPositionListener != null){
if(geoCoder != null){
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
}
else {
loadNearbyPositionListener.loadNearBy(null);
}
}
//返回经纬度
if(getCrtLatlngListener != null){
getCrtLatlngListener.getCrtLatlng(latLng);
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(context, "没有搜索到相关位置信息", Toast.LENGTH_SHORT).show();
//更新搜索状态
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(null);
}
return;
}
AddressComponent addrDetail = result.getAddressDetail();
String cityName = addrDetail.city;
List<PoiInfo> poiInfos = result.getPoiList();
List<LocalBean> list = new ArrayList<LocalBean>();
if(poiInfos != null){
LocalBean addrBean = null;
PoiInfo poiInfo = null;
int size = poiInfos.size();
for(int i = 0; i < size; i++){
poiInfo = poiInfos.get(i);
addrBean = new LocalBean();
addrBean.setName(cityName + "-" + poiInfo.name);
addrBean.setAddr(poiInfo.address);
addrBean.setLatitude(poiInfo.location.latitude);
addrBean.setLongitude(poiInfo.location.longitude);
list.add(addrBean);
}
}
if(loadNearbyPositionListener != null){
loadNearbyPositionListener.loadNearBy(list);
}
else {
LogUtil.e("","--loadNearbyPositionListener is null--");
}
}
/**
* onDestroy
*/
public void onDestroy(){
try {
if(locationClient != null){
locationClient.stop();
locationClient.unRegisterLocationListener(locationListener);
locationClient = null;
}
if(geoCoder != null){
geoCoder.destroy();
geoCoder = null;
}
if(suggestionSearch != null){
suggestionSearch.destroy();
suggestionSearch = null;
}
loadNearbyPositionListener = null;
loadSuggestionSearchListener = null;
getCrtLatlngListener = null;
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onGetSuggestionResult(SuggestionResult result) {
if(result == null){
if(loadSuggestionSearchListener != null){
loadSuggestionSearchListener.loadSuggestion(null);
}
LogUtil.e("","--load--no--suggestion--");
return;
}
List<SuggestionInfo> list = result.getAllSuggestions();
List<LocalBean> addrs = new ArrayList<LocalBean>();
if(list != null){
int size = list.size();
LocalBean addrBean = null;
double latitude = MyApplication.getInstance().getLat();
double longitude = MyApplication.getInstance().getLon();
for(int i = 0; i < size; i++){
addrBean = new LocalBean();
addrBean.setName(list.get(i).key);
addrBean.setLatitude(latitude);
addrBean.setLongitude(longitude);
addrs.add(addrBean);
}
}
if(loadSuggestionSearchListener != null){
loadSuggestionSearchListener.loadSuggestion(addrs);
}
else {
LogUtil.e("","--loadSuggestionSearchListener is null--");
}
}
}
涉及到的listener
import com.baidu.mapapi.model.LatLng;
public interface GetCrtLatlngListener {
public void getCrtLatlng(LatLng latLng);
}
/**
*
* 获取当前所在位置信息listener
*
*/
public interface LoadNearbyPositionListener {
public void loadNearBy(List<LocalBean> addrs);
}
/**
*
* 获取suggestion search listener
*
*/
public interface LoadSuggestionSearchListener {
public void loadSuggestion(List<LocalBean> addrs);
}
bean文件
public class LocalBean implements Serializable{
private static final long serialVersionUID = 1L;
private String name = ""; //地址
private String addr = ""; //详细地址
private double longitude;//地址经度
private double latitude; //地址纬度
private boolean isSelected = false;
public String getAddr() {
return addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAddr(String addr) {
this.addr = addr;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
}
使用百度定位当前位置时
private LocationSet locationSet;//位置设定
private List<LocalBean> addrList;
private LocalBean bbsAddr;
private void initLocate() {
// TODO Auto-generated method stub
locationSet = LocationSet.getInstance(this);
locationSet.loadNearByPosition(this);
}
@Override
public void loadNearBy(List<LocalBean> addrs) {
// TODO Auto-generated method stub
//定位到信息
if(addrs != null && addrs.size() > 0){
addrList = addrs;
bbsAddrPos = 1;
city_view.setText(addrs.get(0).getName());
}
else {
bbsAddrPos = 0;
showToastMsg("没有获取到位置信息");
city_view.setOnClickListener(this);
city_view.setText("所在位置");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(locationSet != null){
locationSet.onDestroy();
locationSet = null;
}
}