这篇文章就主要来讲一下集成高德的导航SDK,实现app内导航;这样就不用调用高德的App了
一、申请key之类的这里就不说了自己去申请就ok
二、我这下载的SDK如下,只有3D地图和导航SDK这两个
三、配置工程导入导航SDK和so库文件
- 配置
Manifest.xml
添加权限
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--这个权限用于允许程序在手机屏幕关闭后后台进程仍然运行-->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
- 配置
Manifest.xml
、添加高德SDK的key和导航Activity
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你申请的KEY" />
<!--导航组件Activity-->
<activity
android:name="com.amap.api.navi.AmapRouteActivity"
android:configChanges="orientation|keyboardHidden|screenSize
android:theme="@android:style/Theme.NoTitleBar" />
四、因为我这里没有需要定制导航的需求所以直接使用高德封装好的导航组件直接使用
发起导航:给定起点、途经点、终点
- 如果不传入起点,那么将会使用当前位置
- 途径点可以不传
/**
* 路线规划
*
* @param slat 起点纬度
* @param slon 起点经度
* @param dlat 终点纬度
* @param dlon 终点经度
*/
public void navigation(Context context, double slat, double slon, double dlat, double dlon) {
Poi start = null;
//如果设置了起点
if (slat != 0 && slon != 0) {
start = new Poi("起点名称", new LatLng(slat, slon), "");
}
Poi end = new Poi("终点名称", new LatLng(dlat, dlon), "");
AmapNaviParams params = new AmapNaviParams(start, null, end, AmapNaviType.DRIVER);
params.setUseInnerVoice(true);
params.setMultipleRouteNaviMode(true);
params.setNeedDestroyDriveManagerInstanceWhenNaviExit(true);
//发起导航
AmapNaviPage.getInstance().showRouteActivity(context, params, null);
}
- 具体的参数取值可以前往导航组件—文档查看
五、来看下实现的效果:首先他会先规划一下路线然后你就可以发起导航了和使用高德App是一样的
六、Android调起高德App进行导航也就不行集成SDK,如下:
public class AMapUtil {
/**
* 路线规划
*
* @param slat 起点纬度
* @param slon 起点经度
* @param dlat 终点纬度
* @param dlon 终点经度
*/
public static void route(Context context, String slat, String slon, String dlat, String dlon) {
if (isInstallApp(context, "com.autonavi.minimap")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage("com.autonavi.minimap");
String uri = "androidamap://route?" + "sourceApplication=" + context.getString(R.string.app_name);
//如果设置了起点
if (!TextUtils.isEmpty(slat) && !TextUtils.isEmpty(slon)) {
uri += "&slat=" + slat + "&slon=" + slon;
}
uri += "&dlat=" + dlat +
"&dlon=" + dlon +
"&dev=" + 0 +
"&t=" + 0 +
"&t=" + 0;
intent.setData(Uri.parse(uri));
context.startActivity(intent);
} else {
String uri = "https://uri.amap.com/navigation?";
//如果设置了起点
if (!TextUtils.isEmpty(slat) && !TextUtils.isEmpty(slon)) {
uri += "from=" + slon + "," + slat + ",起点";
}
uri += "&to=" + dlon + "," + dlat + ",终点" +
"&mode=car";
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(uri));
context.startActivity(intent);
}
}
/**
* 检测应用是否安装
*/
public static boolean isInstallApp(Context context, String packageName) {
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
} catch (Exception e) {
packageInfo = null;
e.printStackTrace();
}
return packageInfo != null;
}
}