Android开发笔记(一百零三)地图与定位SDK

本文详细记录了在Android开发中集成地图SDK的过程,包括如何显示地图、实现定位功能、进行POI搜索以及测量距离和面积。重点介绍了百度地图和高德地图的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集成地图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
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值