最近做的都是关于百度地图的事,整理一下这阶段的东西,便于以后调用。
1.申请百度地图key与下载sdk
1.1申请key的时候要求SHA1值,由于现在基本使用android studio,获取SHA1值的方式不像Eclipse那样方便,这里踩过一些坑。
没关系,我们参考一下前人的博客:
参考博客1:http://blog.csdn.net/qq_29269233/article/details/53725865
参考博客2:http://blog.csdn.net/csdnhejingzhou/article/details/50643246
参考博客3:http://blog.csdn.net/xinpengfei521/article/details/52966428
有了以上3篇博客,基本都能解决这个问题
其实整理一下思路,就是这个文件本来是没有的,需要先去创建一个这样的文件,然后再去执行
所有先进去.android(在C盘,自己用户目录下)
再输入: keytool -list -v -keystore debug.keystore就可以了
2.开始敲代码了
2.1我是创建了一个MapUtil的工具类,在构造方法中传入了一个Context
public class BaiduMapUtil{
public BaiduMapUtil(Context context){
this.context=context;}
}
然后就开始写定位
public MapView mMapView;
public BaiduMap mBaiduMap;
private LocationClient mLocationClient;
private Context context;
/**
* 当前地理坐标
*/
public LatLng mLoactionLatLng;
写一个定位的方法
public void initSettingMapViews(final Context context) {
mBaiduMap=mMapView.getMap();
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
Toast.makeText(context,"正在获取位置请稍后...",Toast.LENGTH_SHORT).show();
// 初始化地图
mMapView.showZoomControls(true);//缩放组件
mMapView.removeViewAt(1);//隐藏logo
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
mBaiduMap.setCompassPosition(new android.graphics.Point(width-100,100));//指南针位置
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocationClient = new LocationClient(context);
// 定位到我的位置
mLocationClient.registerLocationListener(new MyBDLocationListner());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型
option.setScanSpan(900);
mLocationClient.setLocOption(option);
mLocationClient.start(); // 开启定位
// 初始化当前地理坐标
mLoactionLatLng = mBaiduMap.getMapStatus().target;
}
加上上面用到的定位监听器
// 定位监听器
public class MyBDLocationListner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// mapview 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData data = new MyLocationData.Builder().accuracy(0)//
.direction(location.getDirection())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
mBaiduMap.setMyLocationData(data);
// 定位当前的地点
double mLantitude = location.getLatitude();
double mLongtitude = location.getLongitude();
locationProvider = mLongtitude + "," + mLantitude;
mLoactionLatLng = new LatLng(mLantitude,mLongtitude);
//定到的位置局中心
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll,15.0f);//500米
// 判断是否获取成功
if (isLnglat(locationProvider)) { // 获取成功
if (isFristLocation){
isFristLocation = false;
mBaiduMap.animateMapStatus(u);
}
if (mCallBack!=null) {
mBaiduMap.animateMapStatus(u);
mCallBack.getGPS(locationProvider);
}
Toast.makeText(context,"定位成功",Toast.LENGTH_SHORT).show();
} else if (locationProvider.equals("0.0,0.0")
|| !isLnglat(locationProvider)) { // 获取失败
failDialog(); // 获取失败弹框获取提示是否重新定位
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
由于是耗时操作,所以我上面用了一个回调
private CallBack mCallBack;
public void setCallBack(CallBack mCallBack) {
this.mCallBack = mCallBack;
}
public interface CallBack{
void getGPS(String gps);
}
然后我们再Activity里调用的获取到的坐标的时候
BaiduMapUtil.CallBack mCallBack = new BaiduMapUtil.CallBack() {
@Override
public void getGPS(String gps) {
locationProvider = gps;
}
当位置获取失败的时候,我们弹出一个dialog,可以选择重新获取,或者不获取
// 地理位置信息获取失败弹出Dialog
public void failDialog() {
failDialog = new Dialog(context);
failDialog.setTitle("系统信息");
failDialog.setCancelable(false);
View myv = LayoutInflater.from(context).inflate(
R.layout.item_failure_main_prompt_dialog, null);
failDialog.setContentView(myv);
txt_fail_Yes = (TextView) myv.findViewById(R.id.txt_fail_Yes);
txt_fail_No = (TextView) myv.findViewById(R.id.txt_fail_No);
txt_fail_Yes.setOnClickListener(new DialogClick());
txt_fail_No.setOnClickListener(new DialogClick());
failDialog.show(); // 暂放
}
// dialog的点击事件
class DialogClick implements View.OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.txt_fail_Yes:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
failDialog.dismiss();
initSettingMapViews(context); // 重新取定位
}
});
break;
case R.id.txt_fail_No:
mLocationClient.stop();// 关闭定位器
failDialog.dismiss();
break;
default:
break;
}
}
}
在用地图时,我们可能把地图的视角移动到其他地方去了,那这个时候,我们怎么回到自己当前的点呢?
当然是重新定位一下:
public void reLocate(Context context){
Toast.makeText(context,"重新定位...",Toast.LENGTH_SHORT).show();
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocationClient = new LocationClient(context);
// 定位到我的位置
mLocationClient.registerLocationListener(new MyBDLocationListner());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型
option.setScanSpan(900);
mLocationClient.setLocOption(option);
mLocationClient.start(); // 开启定位
// 初始化当前地理坐标
mLoactionLatLng = mBaiduMap.getMapStatus().target;
}
然后在Activity里,对百度地图金星生命周期的管理
@Override
protected void onStop() {
super.onStop();
mapUtil.mBaiduMap.setMyLocationEnabled(false);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapUtil.mMapView.onDestroy();
mapUtil.mBaiduMap.setMyLocationEnabled(false);
mapUtil.poiSearch.destroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapUtil.mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapUtil.mMapView.onPause();
}
@Override
protected void onStart() {
super.onStart();
// 开启图层定位
mapUtil.mBaiduMap.setMyLocationEnabled(true);
}
最后别忘了,判断地理位置是否是经纬度的正则表达式:
// 判断是否是经纬度正则表达式
public boolean isLnglat(String ss) {//纬度,经度
String reg = "[0-9]{2}\\.[0-9]+$,^[0-9]{3}\\.[0-9]+\\";
return ss.matches(reg);
}