前言
最近项目用到了高德地图,基于地图的应用需求还是比较广的,所以想记录一下高德地图的用法,文章基于最新版的高德地图SDK,由于是记录使用方法,所以文字比较枯燥,看不下去的可以看源码,文末会附上源码地址,源码可以直接使用..。
前期准备
- 首先申请高德开发者;
- 接着创建应用和获取key;
- 接着是根据需求下载高德地图的sdk;
将下载好的sdk(jar包)导入Module层下的libs文件夹并添加依赖;
然后是在AndroidManifest添加相关的权限
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- 将申请好的key复制到AndroidManifest下的application目录下
<!--value填写的是高德平台申请好的key-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="bf5f5aa56d91db419f2acb75d36649d0" />
基础地图
前期准备之后就可以开始的弄功能了,首先是显示一个hello map的基础地图
public class BaseMapActivity extends AppCompatActivity {
private MapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_map);
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
}
是的,就这个代码就可以显示一个基础地图了,效果如下,可以说是非常简单了(虽然并没有什么用..)
跳转到系统地图导航
由于导航功能需要导入3D地图等,我们app不需要内置导航功能,而是选择跳转到用户安装的地图应用进行导航。我们只需要把要导航的地点坐标信息在唤起地图应用时传过去即可。代码如下:
public class NavigationActivity extends AppCompatActivity {
private MapView mMapView;
AMap aMap;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location_map);
mMapView = findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);// 此方法必须重写
aMap = mMapView.getMap();
initMap();
initListener();
}
private void initMap() {
MyLocationStyle myLocationStyle;
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
aMap.moveCamera(CameraUpdateFactory.zoomTo(17.9f));
}
private void initListener() {
findViewById(R.id.tv_gaode).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (SystemUtil.isGaoDeMapAvailable(NavigationActivity.this)) {
goToGaode("中国光大银行(广州分行营业部)", "23.141683", "113.342089");
} else {
ToastUtil.showShort(NavigationActivity.this, "请先安装高德地图");
}
}
});
findViewById(R.id.tv_baidu).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (SystemUtil.isBaiduMapAvailable(NavigationActivity.this)) {
goToBaidu("中国光大银行(广州分行营业部)", "23.141683", "113.342089");
} else {
ToastUtil.showShort(NavigationActivity.this, "请先安装百度地图");
}
}
});
}
/**
* 跳转高德导航
*
* @param name 地点
* @param lat 纬度
* @param lon 精度
*/
public void goToGaode(String name, String lat, String lon) {
try {
Intent intent = Intent.getIntent("androidamap://viewMap?sourceApplication=&poiname=" + name + "&lat=" + lat + "&lon=" + lon + "&dev=0");
NavigationActivity.this.startActivity(intent);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 跳转百度地图导航
* @param name
* @param lat
* @param lon
*/
public void goToBaidu(String name, String lat, String lon) {
try {
Intent intent = Intent.getIntent("intent://map/direction?origin=latlng:" + lat + "," + lon + "| name:&destination=" + name + "&mode=driving®ion=&src=yourCompanyName|yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
NavigationActivity.this.startActivity(intent);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
}
效果如下,下图是高德地图的导航