百度地图定位api v6.0.5
注意获取定位信息
拿到定位信息之后 set到BaiduMap中
并一定要设置显示出来(不然只有定位到该区域没有蓝色位置点和精度半径)
<span style="color:#ff0000;">mBaiduMap.setMyLocationEnabled(true);</span>
所有代码如下
package com.ht.activity;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
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.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerDragListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
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.navisdk.adapter.BNOuterTTSPlayerCallback;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import com.baidu.navisdk.adapter.BaiduNaviManager.NaviInitListener;
import com.baidu.navisdk.adapter.BaiduNaviManager.RoutePlanListener;
import com.example.hello.R;
public class MapActivity extends Activity {
MapView mMapView = null;
BaiduMap mBaiduMap = null;
Marker marker = null;
BDLocation location = null;
LatLng ll = null;
//是否第一次定位
private boolean isFristLocation = true;
//是否手动触发请求定位
private boolean isRequest = false;
//我的位置
public ImageView wodeweizhi;
//导航按钮
private Button mWgsNaviBtn = null;
//位置信息
private MyLocationData locData;
// 定位相关
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
setContentView(R.layout.map);
// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mWgsNaviBtn = (Button) findViewById(R.id.avc);
// 手动定位
wodeweizhi = (ImageView) findViewById(R.id.wodeweizhi);
wodeweizhi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
requestLocation();
}
});
// ------定位开始-------
// 声明LocationClient类
mLocationClient = new LocationClient(getApplicationContext());
// 注册监听函数
mLocationClient.registerLocationListener(myListener);
// 定位初始化
initLocation();
// 定位启动
mLocationClient.start();
// 显示中心蓝点及精度范围
mBaiduMap.setMyLocationEnabled(true);
// ------导航开始---------
initListener();
if (initDirs()) {
initNavi();
}
}
@Override
protected void onDestroy() {
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
// 退出时销毁定位
if (mLocationClient != null) {
mLocationClient.stop();
}
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
// ------------定位开始----------------
// 定位初始化
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
int span = 1000;
option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);// 可选,默认false,设置是否使用gps
option.setLocationNotify(true);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);// 可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.setLocOption(option);
}
/**
* 实现实时位置回调监听
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mMapView == null)
return;
// 设置定位 位置信息
locData = new MyLocationData.Builder()
.accuracy(location.getRadius()).direction(100)// 精度范围
.latitude(location.getLatitude())// 经度
.longitude(location.getLongitude()).build();// 纬度
mBaiduMap.setMyLocationData(locData);
// 判断是否第一次定位
if (isFristLocation||isRequest) {
ll = new LatLng(location.getLatitude(), location.getLongitude());
// 根据经纬度 设置地图中心点 和 缩放比例
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 17);
mBaiduMap.animateMapStatus(u);
isRequest = false;
}
isFristLocation = false;
}
}
/**
* 手动请求定位的方法
*/
public void requestLocation() {
isRequest = true;
if(mLocationClient != null && mLocationClient.isStarted()){
mLocationClient.requestLocation();
}
}
// ------------定位结束---------------
}
手动定位方式:设置两个状态位
第一个是是否第一次进行定位isfirst (进入界面后默认定位)
第二个是手动定位 isRequest
BDLocationListener接口的onReceiveLocation(BDLocation location) 方法我还要重点讲解下,我们会发现onReceiveLocation方法会反复执行,他执行的间隔跟LocationClientOption类的setScanSpan()方法设定的值有关,我们设定的是5000毫秒,则onReceiveLocation方法每隔5秒执行一次,注意,当我们设定的值大于1000(ms),定位SDK内部使用定时定位模式。调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。如果你只需要定位一次的话,这个设置小于1000,或者不用设置就可以了,定时定位时,调用一次requestLocation,会定时监听到定位结果
也就是说第一次定位之后 isfirst 设置为false isRequest 设置为false
地图就不会按照毫秒值继续移动到定位位置,但是仍在不断定位
再次点击定位按钮isRequest 设置为true 并根据最新定位值 移动到我的位置