百度地图API应用之——利用定位SDK和地图SDK来进行定位和显示当前位置

在项目开发中,尤其是O2O或者体育运动类项目的APP开发过程中,经常会出现利用GPS定位获取当前位置并在地图上显示的情况,下面就来结合实际的例子来简要介绍一下如何实现这个功能,使用的是百度地图最新的地图SDK(baidumapapi_v2_4_1)和定位SDK(locSDK_4.1) ,这个版本的sdk作了点小修改,无需在初始化时传入key。


一、先看下实际效果图吧,图片最具有说服力。





二、准备工作。

下载最新的百度Android SDK和定位SDK,请参考百度地图API 官网

配置相关参数

1、申请密钥,申请步骤官网也有详细介绍,请参考http://developer.baidu.com/map/sdkandev-14.htm

2、工程配置。

第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;

    注:liblocSDK3.so和locSDK_3.1.jar为百度定位SDK所使用资源,开发者可根据实际需求自行添加。


第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。

    通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。

注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:

1. 在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;

2. Project -> clean-> clean all .

三 、显示地图

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

    第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

    第二步:在Manifest中添加使用权限、Android版本支持和对应的开发密钥;

    常用使用权限如下(开发者可根据自身程序需求,添加所需权限):

<!--使用网络功能所需权限  -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">
</uses-permission>
<!-- SDK离线地图和cache功能需要读写外部存储器 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS">
</uses-permission>
<!-- 获取设置信息和详情页直接拨打电话需要以下权限  -->
<uses-permission android:name="android.permission.READ_PHONE_STATE">
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>
<!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE">
</permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS"/>                  
            

 配置Activity:

<activity android:name=".MapDemo"
          android:screenOrientation="sensor"
          android:configChanges="orientation|keyboardHidden">
</activity>

  添加屏幕及版本支持:

<supports-screens android:largeScreens="true"
            android:normalScreens="true"
            android:smallScreens="true"
            android:resizeable="true"
            android:anyDensity="true"/>
<uses-sdk android:minSdkVersion="7"></uses-sdk>

 添加对应的开发密钥: 开发密钥就是前面申请的密钥

<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发密钥">
</meta-data>

第三步:在布局xml文件中添加地图控件,布局文件保存为activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
          
            <com.baidu.mapapi.map.MapView android:id="@+id/mapview"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:clickable="true" />
</LinearLayout>

 第四步:初始化地图Activity、使用Key:

    在MyMapActivity中定义成员变量:

private BMapManager manager = null;
	private MapView mMapView = null;

	private double latitude;
	private double longitude;
	private BDLocationListener myListener;

	private LocationClient mlLocationClient;
	private static final int UPDATE_TIME = 5000;

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		initMap();// 初始化百度地图引擎
		
		setContentView(R.layout.activity_main);
		
		initView();// 初始化显示视图
	}

第五步:初始化百度地图引擎  注意:一定要在setContentview之前初始化引擎,否则就会报错

private void initMap() {
<span style="WHITE-SPACE: pre">		</span>if (manager == null) {
<span style="WHITE-SPACE: pre">			</span>manager = new BMapManager(getApplicationContext());


<span style="WHITE-SPACE: pre">			</span>manager.init(new MKGeneralListener() {


<span style="WHITE-SPACE: pre">				</span>@Override
<span style="WHITE-SPACE: pre">				</span>public void onGetPermissionState(int iError) {
<span style="WHITE-SPACE: pre">					</span>if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
<span style="WHITE-SPACE: pre">						</span>Toast.makeText(getApplicationContext(), "授权失败", 0)
<span style="WHITE-SPACE: pre">								</span>.show();
<span style="WHITE-SPACE: pre">					</span>}
<span style="WHITE-SPACE: pre">				</span>}


<span style="WHITE-SPACE: pre">				</span>@Override
<span style="WHITE-SPACE: pre">				</span>public void onGetNetworkState(int iError) {
<span style="WHITE-SPACE: pre">					</span>if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
<span style="WHITE-SPACE: pre">						</span>Toast.makeText(getApplicationContext(), "网络连接错误", 0)
<span style="WHITE-SPACE: pre">								</span>.show();
<span style="WHITE-SPACE: pre">					</span>}
<span style="WHITE-SPACE: pre">				</span>}
<span style="WHITE-SPACE: pre">			</span>});
<span style="WHITE-SPACE: pre">		</span>}
<span style="WHITE-SPACE: pre">	</span>}

第六步:初始化显示地图

private void initView() {
		mMapView = (MapView) findViewById(R.id.mapview);
		mMapView.setBuiltInZoomControls(true);

		mlLocationClient = new LocationClient(this);

		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true); // 是否打开GPS
		option.getAddrType();
		option.setCoorType("bd09ll"); // 设置返回值的坐标类型。
		option.setPriority(LocationClientOption.NetWorkFirst); // 设置定位优先级
		option.setProdName("demo"); // 设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
		option.setScanSpan(UPDATE_TIME); // 设置定时定位的时间间隔。单位毫秒
		option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
		mlLocationClient.setLocOption(option);

		myListener = new MyLocationListener();
		mlLocationClient.registerLocationListener(myListener); // 注册监听函数

		mlLocationClient.start();

		if (mlLocationClient != null && mlLocationClient.isStarted())
			mlLocationClient.requestLocation();
		else
			Log.d("LocSDK3", "locClient is null or not started");
		MapController mMapController = mMapView.getController();
		mMapController.setZoom(18);// 设置地图zoom级别
		mMapController.enableClick(true);//

	}

其中用到了百度定位SDK, 所以需要 在application标签中声明service组件,每个app拥有自己单独的定位service

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>

第七步:自定义位置变化监听器,重写其中的方法,在位置变化时实现定位功能

private class MyLocationListener implements BDLocationListener {

		private LocationData locData;

		@Override
		public void onReceiveLocation(BDLocation location) {
			latitude = location.getLatitude();
			longitude = location.getLongitude();

			MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
					mMapView);
			if (locData == null) {
				locData = new LocationData();
				locData.latitude = latitude;
				locData.longitude = longitude;
				locData.direction = 2.0f;
			}
			myLocationOverlay.setData(locData);
			mMapView.getOverlays().add(myLocationOverlay);
			mMapView.refresh();
			mMapView.getController().animateTo(
					new GeoPoint((int) (locData.latitude * 1e6),
							(int) (locData.longitude * 1e6)));
		}

		@Override
		public void onReceivePoi(BDLocation location) {
		}

	}

第八步: 重写以下方法,管理API

@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		mMapView.onResume();
		if (manager != null) {
			manager.start();
		}
		super.onResume();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub

		mMapView.onPause();
		if (manager != null) {
			manager.stop();
		}
		super.onPause();
	}

	@Override
	protected void onDestroy() {
		mMapView.destroy();
		if (manager != null) {
			manager.destroy();
			manager = null;
		}

		if (mlLocationClient != null && mlLocationClient.isStarted()) {
			mlLocationClient.stop();
			mlLocationClient = null;
		}

		super.onDestroy();
	}


到这里,整个过程基本就结束了,小小例子一个,希望可以帮助大家更好的使用百度地图API


转载请注明出处;http://blog.csdn.net/csr_yang/article/details/24502031

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

douban.com/note/362233142/
douban.com/note/362233170/
douban.com/note/362233192/
douban.com/note/362233230/
douban.com/note/362233280/
douban.com/note/362233320/
douban.com/note/362233377/
douban.com/note/362233418/
douban.com/note/362233449/
douban.com/note/362233591/
douban.com/note/362233627/
douban.com/note/362233641/
douban.com/note/362233666/
douban.com/note/362233716/
douban.com/note/362233749/
douban.com/note/362233767/
douban.com/note/362233802/
douban.com/note/362233829/
douban.com/note/362233914/
douban.com/note/362233979/
douban.com/note/362234006/
douban.com/note/362234059/
douban.com/note/362234084/
douban.com/note/362234103/
douban.com/note/362234112/
douban.com/note/362234131/
douban.com/note/362234187/
douban.com/note/362234234/
douban.com/note/362234244/
douban.com/note/362234278/
douban.com/note/362234309/
douban.com/note/362234314/
douban.com/note/362234345/
douban.com/note/362234387/
douban.com/note/362234401/
douban.com/note/361623293/
douban.com/note/362233116/
douban.com/note/362233163/
douban.com/note/362233183/
douban.com/note/362233222/
douban.com/note/362233251/
douban.com/note/362233303/
douban.com/note/362233353/
douban.com/note/362233381/
douban.com/note/362233436/
douban.com/note/362233578/
douban.com/note/362233616/
douban.com/note/362233633/
douban.com/note/362233671/
douban.com/note/362233722/
douban.com/note/362233756/
douban.com/note/362233784/
douban.com/note/362233815/
douban.com/note/362233830/
douban.com/note/362233882/
douban.com/note/362233897/
douban.com/note/362233949/
douban.com/note/362233999/
douban.com/note/362234030/
douban.com/note/362234127/
douban.com/note/362234146/
douban.com/note/362234197/
douban.com/note/362234209/
douban.com/note/362234268/
douban.com/note/362234324/
douban.com/note/362234330/
douban.com/note/362234393/
douban.com/note/362234421/

 

 

 


 



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值