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

百度地图定位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 并根据最新定位值 移动到我的位置





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值