注意点:百度的定位编码:是bd09ll,09后面是英文字母l
package mwteck.ettda.map;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.BDNotifyListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
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.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 java.util.List;
import mwteck.ettda.R;
import mwteck.ettda.Utils.L;
import mwteck.ettda.Utils.Tools;
/**
* Created by 刘世华 on 2017/5/9 0009.
* Discription :
*/
public class MapLocationUtil {
private Context context;
protected LocationClientOption.LocationMode tempMode = LocationClientOption.LocationMode.Device_Sensors; // GPS定位
protected LocationClient locationClient = null;
public static final int MAPLOCAL_SUCCESS = 11;
public static final int MAPLOCAL_FAILURE = 22;
public static final int MAPLOCAL_SEARCH_OK = 33;
public static final int MAPLOCAL_SEARCH_FAILURE = 44;
private LocationClientOption option;
public MapLocationUtil(Context context) {
this.context = context;
locationClient = new LocationClient(context.getApplicationContext());
initLocationOption(context);
}
public void getLocalPoint(Context context, final Handler handler) {//获取当前位置
locationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
Message message = new Message();
message.what = MAPLOCAL_SUCCESS;
message.obj = location;
handler.sendMessage(message);
locationClient.stop();
}
});
locationClient.start();
}
private void initLocationOption(Context context) {
option = new LocationClientOption();
if (Tools.isInternetConnect(context)) {
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
} else {
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
}
option.setCoorType("bd09ll");//返回百度经纬度坐标——ll是英文字母l
option.setNeedDeviceDirect(true);//需要手机的方向信息
option.setScanSpan(2000);//设置定位次数,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setTimeOut(9 * 1000);//10秒定位不到就返回
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationDescribe(true);
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIsNeedLocationPoiList(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.setIgnoreKillProcess(true);
//可选,默认false,设置是否收集CRASH信息,默认收集
option.SetIgnoreCacheException(false);
//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
option.setEnableSimulateGps(false);
locationClient.setLocOption(option);
}
public void setLocalPoint(final Handler handler, final BaiduMap baiduMap, final boolean isNeedShowLocation) {//获取当前位置
if (locationClient == null) {
locationClient = new LocationClient(context.getApplicationContext());
initLocationOption(context);
}
locationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
Message message = new Message();
message.what = MAPLOCAL_SUCCESS;
message.obj = location;
L.d("定位成功:" + location.getLatitude() + ":" + location.getLongitude() + "\t" + location.getAddrStr());
handler.sendMessage(message);
if (isNeedShowLocation) {
setLocationMark(baiduMap, latLng);//设置定位图标
}
getAroundPoi(handler, new LatLng(location.getLatitude(), location.getLongitude()));
}
});
locationClient.start();
}
// 重新定位
public void restartLocation() {
if (locationClient != null) {
if (locationClient.isStarted()) {
locationClient.stop();
}
if (option != null)
if (Tools.isInternetConnect(context)) {
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
} else {
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
}
locationClient.setLocOption(option);
locationClient.start();
}
}
//设置定位点
public void setLocationMark(BaiduMap baiduMap, LatLng latLng) {
if (baiduMap == null) return;
baiduMap.clear();//清除之前的marker
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.map_point_48px);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(latLng)
.icon(bitmap);
//在地图上添加Marker,并显示
baiduMap.addOverlay(option);
//设置显示中心点
MapStatus mapStatus = new MapStatus.Builder(baiduMap.getMapStatus())
.target(latLng)//设置中心点
.zoom(17f)//缩放比例
.overlook(-10f)//俯视角度
.build();
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
baiduMap.setMapStatus(statusUpdate);//设置地图状态改变
}
/**
* 设置定位点(不清除之前的点)
*
* @param baiduMap
* @param latLng
* @param zoom 设置地图放大比例
*/
public void setLocationMark(BaiduMap baiduMap, LatLng latLng, float zoom) {
if (baiduMap == null) return;
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.my_local);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(latLng)
.icon(bitmap);
//在地图上添加Marker,并显示
baiduMap.addOverlay(option);
//设置显示中心点
MapStatus mapStatus = new MapStatus.Builder(baiduMap.getMapStatus())
.target(latLng)//设置中心点
.zoom(zoom)//缩放比例
.overlook(-10f)//俯视角度
.build();
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
baiduMap.setMapStatus(statusUpdate);//设置地图状态改变
}
//设置定位点_图标为百度系统自带
/**
* @param baiduMap
* @param latLng
* @param zoom 地图放大比例
*/
public void setLocation(BaiduMap baiduMap, LatLng latLng, float zoom) {
baiduMap.clear();
// 开启定位图层
baiduMap.setMyLocationEnabled(true);
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(0)
.direction(0)// 此处设置开发者获取到的方向信息,顺时针0-360
.latitude(latLng.latitude)
.longitude(latLng.longitude).build();
// 设置定位数据
baiduMap.setMyLocationData(locData);
MapStatus mapStatus = new MapStatus.Builder(baiduMap.getMapStatus())
.target(latLng)//设置中心点
.zoom(zoom)//缩放比例
.overlook(-10f)//俯视角度
.build();
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
baiduMap.setMapStatus(statusUpdate);//设置地图状态改变
}
public void getAroundPoi(final Handler handler, LatLng latLng) {
// 创建GeoCoder实例对象
final GeoCoder geoCoder = GeoCoder.newInstance();
// 设置查询结果监听者
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
return;
}
final List<PoiInfo> poiInfos = result.getPoiList();
if (poiInfos != null && poiInfos.size() > 0) {
Message message = new Message();
message.what = MAPLOCAL_SEARCH_OK;
message.obj = poiInfos;
handler.sendMessage(message);
geoCoder.destroy();
stopLocation();
} else {
Message message = new Message();
message.what = MAPLOCAL_SEARCH_FAILURE;
message.obj = poiInfos;
handler.sendMessage(message);
}
}
});
//发起地理编码检索
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
}
//关闭定位
public void stopLocation() {
if (locationClient != null && locationClient.isStarted()) {
locationClient.stop();
}
}
//是否开启GPS
public boolean isOpenGPS(Activity activity) {
LocationManager locManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
return locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* 设置GPS弹框
*
* @param activity
* @param GPS_REQUEST_CODE
*/
public void showSetGPSDialog(final Activity activity, final int GPS_REQUEST_CODE) {
new AlertDialog.Builder(activity)
.setTitle("定位提示")
.setMessage("GPS未开启,GPS开启后定位更精确,是否设置GPS?")
// 拒绝, 退出应用
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.setting,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//跳转GPS设置界面
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
activity.startActivityForResult(intent, GPS_REQUEST_CODE);
}
})
.setCancelable(false)
.show();
}
}