Android 不归路之百度地图API学习(定位篇)

来源:互联网 发布:如何看java源码 编辑:程序博客网 时间:2024/05/16 11:32

百度地图定位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();@Overrideprotected 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() {@Overridepublic void onClick(View arg0) {requestLocation();}});// ------定位开始-------// 声明LocationClient类mLocationClient = new LocationClient(getApplicationContext());// 注册监听函数mLocationClient.registerLocationListener(myListener);// 定位初始化initLocation();// 定位启动mLocationClient.start();// 显示中心蓝点及精度范围mBaiduMap.setMyLocationEnabled(true);// ------导航开始---------initListener();if (initDirs()) {initNavi();}}@Overrideprotected void onDestroy() {// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();// 退出时销毁定位if (mLocationClient != null) {mLocationClient.stop();}super.onDestroy();}@Overrideprotected void onPause() {super.onPause();// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overrideprotected 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,设置是否使用gpsoption.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 {@Overridepublic 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 并根据最新定位值 移动到我的位置





0 0