集成地图SDK
国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来。下面是我在集成地图SDK时遇到的问题说明:1、点击基本地图功能选项,不能打开地图,弹出“key验证出错!请在AndroidManifest.xml文件中检查key设置的”的红色字提示。查看日志提示“galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy”
该问题是因为key值对应的签名与app打包用的签名不一致。app在开发时与发布时有两个不同的签名,开发时用的是ADT默认签名,查看默认签名的SHA1值可依次选择“Window”->“Preferences”->“Android”->“Build SHA1 fingerprint”。app发布时的签名是密钥文件的签名,查看发布签名的SHA1值可依次选择“File”->“Export”->“Export Android Application”->“Next”后选择密钥文件并输入密码与app输出路径->在“Certificate fingerprints”下查看SHA1值。
2、百度地图SDK3.6及以上版本找不到overlayutil包。
这是因为新版SDK的jar包不再包含这部分源码,得到官方demo的src目录下获取源码加入到开发者自己的工程中,源码路径为:BaiduMap_AndroidMapSDK_v3.7.1_Sample\BaiduMapsApiDemo\src\com\baidu\mapapi
3、在一个工程中同时包含了百度地图和高德地图的sdk,编译时报错“Found duplicate file for APK: assets/lineDashTexture.png”。
这是因为百度和高德的sdk,其jar包存在同名文件“assets/lineDashTexture.png”,所以无法通过编译。即百度sdk与高德sdk是互斥的,不能同时存在于同个工程中,必须分开来使用。
显示地图和定位
对于一个地图SDK来说,首先要显示地图,然后定位到当前城市。这方面百度地图和高德地图的处理代码差不多,下面是两种地图sdk显示并定位的代码例子:
百度地图
// 以下主要是定位用到的代码
private MapView mMapView;
private BaiduMap mMapLayer;
private LocationClient mLocClient;
private boolean isFirstLoc = true;// 是否首次定位
private void initLocation() {
mMapView = (MapView) findViewById(R.id.bmapView);
// 先隐藏地图,待定位到当前城市时再显示
mMapView.setVisibility(View.INVISIBLE);
mMapLayer = mMapView.getMap();
mMapLayer.setOnMapClickListener(this);
// 开启定位图层
mMapLayer.setMyLocationEnabled(true);
mLocClient = new LocationClient(this);
// 设置定位监听器
mLocClient.registerLocationListener(new MyLocationListenner());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
option.setIsNeedAddress(true); // 设置true才能获得详细的地址信息
// 设置定位参数
mLocClient.setLocOption(option);
// 开始定位
mLocClient.start();
//获取最近一次的位置
// mLocClient.getLastKnownLocation();
}
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
Log.d(TAG, "location is null or mMapView is null");
return;
}
m_latitude = location.getLatitude();
m_longitude = location.getLongitude();
String position = String.format("当前位置:%s|%s|%s|%s|%s|%s|%s",
location.getProvince(), location.getCity(),
location.getDistrict(), location.getStreet(),
location.getStreetNumber(), location.getAddrStr(),
location.getTime());
loc_position.setText(position);
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(m_latitude)
.longitude(m_longitude).build();
mMapLayer.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(m_latitude, m_longitude);
MapStatusUpdate update = MapStatusUpdateFactory.newLatLngZoom(ll, 14);
mMapLayer.animateMapStatus(update);
// 定位到当前城市时再显示图层
mMapView.setVisibility(View.VISIBLE);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
高德地图
// 以下主要是定位用到的代码
private MapView mMapView;
private AMap mMapLayer;
private AMapLocationClient mLocClient;
private boolean isFirstLoc = true;// 是否首次定位
private void initLocation(Bundle savedInstanceState) {
mMapView = (MapView) findViewById(R.id.amapView);
mMapView.onCreate(savedInstanceState);
// 先隐藏地图,待定位到当前城市时再显示
mMapView.setVisibility(View.INVISIBLE);
if (mMapLayer == null) {
mMapLayer = mMapView.getMap();
}
mMapLayer.setOnMapClickListener(this);
// 开启定位图层
mMapLayer.setMyLocationEnabled(true);
mMapLayer.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
mLocClient = new AMapLocationClient(this.getApplicationContext());
// 设置定位监听器
mLocClient.setLocationListener(new MyLocationListenner());
AMapLocationClientOption option = new AMapLocationClientOption();
option.setLocationMode(AMapLocationMode.Battery_Saving);
option.setNeedAddress(true); // 设置true才能获得详细的地址信息
// 设置定位参数
mLocClient.setLocationOption(option);
// 开始定位
mLocClient.startLocation();
//获取最近一次的位置
// mLocClient.getLastKnownLocation();
}
public class MyLocationListenner implements AMapLocationListener {
@Override
public void onLocationChanged(AMapLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
Log.d(TAG, "location is null or mMapView is null");
return;
}
m_latitude = location.getLatitude();
m_longitude = location.getLongitude();
String position = String.format("当前位置:%s|%s|%s|%s|%s|%s|%s",
location.getProvince(), location.getCity(),
location.getDistrict(), location.getStreet(),
location.getAdCode(), location.getAddress(),
location.getTime());
loc_position.setText(position);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(m_latitude, m_longitude);
CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 12);
mMapLayer.moveCamera(update);
// 定位到当前城市时再显示图层
mMapView.setVisibilit