首先现在地图应用的很广泛,不多言,今天我要说的就是百度地图上定位功能,首先你肯定需要调用百度接口,所以就应用到百度的JAR包,配置我就不说了,可以参考这的http://developer.baidu.com/map/index.php?title=androidsdk(创建并配置工程)登陆百度账号创建一个基本地图,这个我就不废话说了,因为 官网百度地图API上都有。
相信大家这个都会,接下来就是重点,如何定位的实现:
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
首先我们需要初始化一下控件
mMapView = (MapView) findViewById(R.id.near_acticity_mapView);
mBaiduMap = mMapView.getMap();
context = NearActivity.this ;
isFristLocation = true ;
首先我们要初始化一下定位
// 定位初始化
LocationClient mLocationClient = new LocationClient(this);
MyLocationListener mMyLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mMyLocationListener);
// 设置定位的相关配置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocationClient.setLocOption(option);
在当中你会发现MyLocationListener没有这个类啊,其实定位的主要实现就在这,这个是 实现定位回调监听
public class MyLocationListener implements BDLocationListener
{
@Override
public void onReceiveLocation(BDLocation location)
{
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(mXDirection).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mCurrentAccracy = location.getRadius();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
mCurrentLantitude = location.getLatitude();
mCurrentLongitude = location.getLongitude();
// 设置自定义图标
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.navi_map_gps_locked);
MyLocationConfigeration config = new MyLocationConfigeration(
mCurrentMode, true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config);
// 第一次定位时,将地图位置移动到当前位置
if (isFristLocation)
{
isFristLocation = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
}
当然这个代码到这里也算完美结束啦,那你就大错特错啦,jar包啥的还有别忘了生命周期跟AndroidManifest.xml里面的Key跟service,还有权限等等哦
,下面就是源码NearActivity.java
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.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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.easemob.chatuidemo.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Window;
public class NearActivity extends Activity{
private MapView mMapView;
private BaiduMap mBaiduMap ;
private Context context ;
/**
* 定位的监听器
*/
private MyLocationListener mMyLocationListener;
/**
* 判断是否是第一次定位
*/
private boolean isFristLocation ;
/**
* 当前定位的模式
*/
private LocationMode mCurrentMode = LocationMode.NORMAL;
/**
* 经纬度
*/
private double mCurrentLantitude;
private double mCurrentLongitude;
/**
* 当前的精度
*/
private float mCurrentAccracy;
/**
* 定位的客户端
*/
private LocationClient mLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_near_map);
//初始化
initView();
//初始化定位
initLocation();
}
private void initLocation() {
// 定位初始化
mLocationClient = new LocationClient(context);
mMyLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mMyLocationListener);
// 设置定位的相关配置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocationClient.setLocOption(option);
}
private void initView() {
mMapView = (MapView) findViewById(R.id.near_acticity_mapView);
mBaiduMap = mMapView.getMap();
context = NearActivity.this ;
isFristLocation = true ;
}
/**
* 实现实位回调监听
*/
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
mCurrentAccracy = location.getRadius();
mCurrentLantitude = location.getLatitude();
mCurrentLongitude = location.getLongitude();
// 设置自定义图标
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.navi_map_gps_locked);
MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, null);
mBaiduMap.setMyLocationConfigeration(config);
if(isFristLocation){
isFristLocation = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
@Override
public void onReceivePoi(BDLocation arg0) {
// TODO Auto-generated method stub
}
}
@Override
protected void onStart() {
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted())
{
mLocationClient.start();
}
super.onStart();
}
@Override
protected void onStop() {
// 关闭图层定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
super.onStop();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mMapView = null;
}
@Override
protected void onPause()
{
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
以及咱们的AndroidManifest.xml中的
<application
。。。。>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="iHvF1CYxjKYk4QojPb2unVTx" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
</application>
当然权限啥的还有KEY的申请点这里(百度地图API)http://developer.baidu.com/map/index.php?title=androidsdk申请一个就行啦