基于Android SDK v3.5.0的百度地图定位与覆盖物的添加。
先申请key http://lbsyun.baidu.com/apiconsole/key (先注册百度账号)
接着添加jar包 按照这个步骤来http://developer.baidu.com/map/index.php?title=androidsdk/guide/buildproject
(以上两步和以前的版本一模一样,我实在是懒得写了,有一点是jar包我直接放在libs下面,没有进行任何BuildingPath添加,直接出现在了Android Private Libraries中,然后就直接可以用了)
然后在清单配置文件里添加
一个是申请的key值,一个是定位服务
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者申请的key值" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
....
</application>`
权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_LOGS" />
XML文件
<com.baidu.mapapi.map.MapView
android:id="@+id/id_bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"/>
初始化百度地图
SDKInitializer.initialize(this);
这句话写在Application(推荐)和MainActivity中都可以,但是要在setContentView()之前
例:
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(this);
}
}
或者
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
....
}
准备工作结束,接下来是正文!
//OnGetGeoCoderResultListener这个地理编码的监听既可以实现接口,也可以setlistener 内部匿名类实现
public class MainActivity extends Activity implements OnGetGeoCoderResultListener{
public MapView mapView = null;
public BaiduMap baiduMap = null;
GeoCoder search = null;
// 定位相关声明
public LocationClient locationClient = null;
//自定义图标
boolean isFirstLoc = true;// 是否首次定位
private static String city = "深圳市";
private static String addr1 = "深圳大学";
private static String addr2 = "维用大厦";
private static String addr3 = "桑达科技大厦";
private static String addr4 = "科苑西小区 ";
private static String addr5 = "科技工业大厦";
private static List<infoEntity> infoList = new ArrayList<infoEntity>();
static {
infoList.add(new infoEntity(city, addr1));
infoList.add(new infoEntity(city, addr2));
infoList.add(new infoEntity(city, addr3));
infoList.add(new infoEntity(city, addr4));
infoList.add(new infoEntity(city, addr5));
}
public BDLocationListener myListener = new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
// mapview 销毁后不在处理新接收的位置
if (location == null || mapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
baiduMap.setMyLocationData(locData); //设置定位数据
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16); //设置地图中心点以及缩放级别
baiduMap.animateMapStatus(u);
}
// 遍历集合多次监听 添加覆盖物
for(int i=0;i<infoList.size();i++){
search = GeoCoder.newInstance();
search.setOnGetGeoCodeResultListener(MainActivity.this);
//这是一个自己写的实体类 只包含两个参数 String city 和String address
infoEntity entity = infoList.get(i);
String c = entity.getCity();
String a = entity.getAddress();
search.geocode(new GeoCodeOption().city(c).address(a));
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView = (MapView) this.findViewById(R.id.id_bmapView); // 获取地图控件引用
mapView.removeViewAt(1); //删除百度地图Logo(若作为商用软件最好不要删除logo,百度会追责)
//获取地图控制器
baiduMap = mapView.getMap();
//设置地图初始缩放
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);
baiduMap.setMapStatus(msu);
//开启定位图层
baiduMap.setMyLocationEnabled(true);
locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类
locationClient.registerLocationListener(myListener); // 注册监听函数
setLocationOption(); //设置定位参数
locationClient.start(); // 开始定位
}
//反地理编码(坐标->地址)
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
}
//地理编码 (地址->坐标)
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
//添加覆盖物
baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon2)));
}
private void setLocationOption() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开GPS
option.setServiceName("com.baidu.location.service_v2.9");//这一句加和不加好像都行,可能新版本内置了
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll"); // 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000); // 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向
locationClient.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
locationClient.stop();
// 关闭定位图层
baiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
}
}
效果图
以上就是主要代码了,还有一个实体类没粘,因为我太懒了,而且文章有点长,就不粘了,后面有项目源码,不要分的,欢迎下载!
代码写的很烂的,静态代码块那部分主要是为了模拟从其他地方传过来的地址信息,其中还有很多需要改进的地方,希望各位猿友指出批评,在此先谢过大家!