您的位置:首页 > 移动开发 > Android开发

Android-百度地图-定位功能

2016-03-09 21:38 483 查看
在上一篇android-百度地图-手机显示地图的基础上,实现定位功能;

这里先说明一下几个比较重要的类:

LocationClient :定位服务的客户端。宿主程序在客户端声明此类,是实现百度SDK,Android定位的核心类.

LocationClientOption:该类用来设置定位SDK的定位方式。配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等

BDLocationListener:定位请求回调接口监听事件,在函数中需要重写的

BDLocation:回调的百度坐标类,内部封装了如经纬度、半径等属性信息

思路:1、定义并声明一个LocationClient类的对象MyLocationClient,并在OnStart()、OnStop()和OnDestory()中调用类的开启、停止和销毁的方法(避免关闭之后仍在定位);

2、写一个MyBDLocationListener类继承BDLocationListene接口,并重写其中的方法;

3、对象MyLocationClient注册定位监听;

4、使用类LocationClientOption来设置对象MyLocationClient的定位方式,并绑定。

注意事项:必须在AndroidManifest.xml中声明一个service(在百度定位提供的Demo中,一般都能找到)

<service android:name="com.baidu.location.f" android:process=":remote" android:enabled="true">
<intent-filter>
<action android:name="com.baidu.location.service_v2.2"> </action>
</intent-filter>
</service>


好了,话不多说上代码:

package com.hpu.hanyu_baidumap;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
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.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.TextureMapView;
import com.baidu.mapapi.model.LatLng;

public class MainActivity extends Activity {

private TextureMapView mMapView = null;
//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动,是实现百度SDK,Android定位的核心类
private LocationClient mLocationClient;
private MyLocationListener myLocationListener;
private boolean isFirstIn = true;
//定义 BaiduMap 地图对象的操作方法与接口
private BaiduMap mBaiduMap;

private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);

InitView();
InitLocation();

}

private void InitView() {
// TODO Auto-generated method stub
mMapView = (TextureMapView) findViewById(R.id.id_bmapView);
mBaiduMap = mMapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);//设置地图的缩放比例
mBaiduMap.setMapStatus(msu);

this.context = this;
}

private void InitLocation() {
// TODO Auto-generated method stub
mLocationClient = new LocationClient(this);
myLocationListener = new MyLocationListener();
//注册定位监听
mLocationClient.registerLocationListener(myLocationListener);
//该类用来设置定位SDK的定位方式。配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");
option.setIsNeedAddress(true);//设置能得到地理位置
option.setOpenGps(true);
option.setScanSpan(1000);
//绑定定位方式
mLocationClient.setLocOption(option);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {
case R.id.id_map_common:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.id_map_site:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.id_map_traffic:
if(mBaiduMap.isTrafficEnabled()){
mBaiduMap.setTrafficEnabled(false);
item.setTitle("实时交通(off)");
}else{
mBaiduMap.setTrafficEnabled(true);
item.setTitle("实时交通(on)");
}
break;
default:
break;
}

return super.onOptionsItemSelected(item);
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
//开启定位
mBaiduMap.setMyLocationEnabled(true);
if(!mLocationClient.isStarted()){
mLocationClient.start();
}

}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mMapView.onResume();
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mMapView.onDestroy();
}
//重写定位请求回调接口监听事件
class MyLocationListener implements BDLocationListener {

//BDLocation,回调的百度坐标类,内部封装了如经纬度、半径等属性信息
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
//定位数据建造器
MyLocationData data = new MyLocationData.Builder()//
.accuracy(location.getRadius())
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(data);
//MyLocationConfiguration config = new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL, arg1, arg2);
//第一次地图定位在所处位置
if(isFirstIn){
//地理坐标基本数据结构
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());//经度和纬度
//MapStatusUpdateFactory,生成地图状态将要发生的变化
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
Toast.makeText(context, location.getAddrStr(), Toast.LENGTH_SHORT).show();//显示出自己的当前位置
isFirstIn = false;

}

}

}

}
如图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: