android app调用第三方地图路线规划导航(百度,高德,腾
2017-10-19 本文已影响494人
星辉祝愿
因为直接使用高德的sdk提供的导航被投诉说不准,所以需要接第三方。 把BAT系的地图都接上了,有兄弟找到其他的地图调用方法告诉下小弟,一起完善。
工具类: MapRouteUtil
地图包名:
public static String GAODE_MAP = "com.autonavi.minimap";
public static String BAIDU_MAP = "com.baidu.BaiduMap";
public static String TENXUN_MAP = "com.tencent.map";
public static String GOOGLE_MAP = "com.google.android.apps.maps";
谷歌地图被墙了所以没有去接入。找到搜狗,凯立德等其他地图的调用告诉下我哈哈。
验证手机中是否安装了地图
public static boolean isInstalled(Context context, String packageName) {
boolean installed = false;
if (TextUtils.isEmpty(packageName)) {
return false;
}
List<ApplicationInfo> installedApplications = context.getPackageManager().getInstalledApplications(0);
for (ApplicationInfo in : installedApplications) {
if (packageName.equals(in.packageName)) {
installed = true;
break;
} else {
installed = false;
}
}
return installed;
}
高德地图
http://lbs.amap.com/api/amap-mobile/guide/android/route
/**
* 启动高德App进行路线规划导航 http://lbs.amap.com/api/amap-mobile/guide/android/route
*
* @param context
* @param sourceApplication 必填 第三方调用应用名称。如 "appName"
* @param sid
* @param sla
* @param slon
* @param sname
* @param did
* @param dlat
* @param dlon
* @param dName
* @param dev 起终点是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
* @param t t = 0(驾车)= 1(公交)= 2(步行)= 3(骑行)= 4(火车)= 5(长途客车)
* (骑行仅在V788以上版本支持)
*/
public static void toGaoDeRoute(Context context, String sourceApplication
, String sid, String sla, String slon, String sname
, String did, String dlat, String dlon, String dName
, String dev, String t) {
StringBuffer stringBuffer = new StringBuffer("androidamap://route/plan?sourceApplication=").append(sourceApplication);
if (!TextUtils.isEmpty(sid)) {
stringBuffer.append("&sid=").append(sid);
}
if (!TextUtils.isEmpty(sla)) {
stringBuffer.append("&sla=").append(sla);
}
if (!TextUtils.isEmpty(sla)) {
stringBuffer.append("&sla=").append(sla);
}
if (!TextUtils.isEmpty(slon)) {
stringBuffer.append("&slon=").append(slon);
}
if (!TextUtils.isEmpty(sname)) {
stringBuffer.append("&sname=").append(sname);
}
if (!TextUtils.isEmpty(did)) {
stringBuffer.append("&did=").append(did);
}
stringBuffer.append("&dlat=").append(dlat);
stringBuffer.append("&dlon=").append(dlon);
stringBuffer.append("&dName=").append(dName);
stringBuffer.append("&dev=").append(dev);
stringBuffer.append("&t=").append(t);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
//将功能Scheme以URI的方式传入data
Uri uri = Uri.parse(stringBuffer.toString());
intent.setData(uri);
context.startActivity(intent);
}
百度地图
http://lbsyun.baidu.com/index.php?title=uri/api/android
ps: 百度的坐标类型是:bd09 。如果使用高德的坐标 需要 转换坐标 或者 添加参数 coord_type=gcj02
/**
* 百度路线规划 URL接口:baidumap://map/direction
*
* @param context
* @param origin 起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示
* origin和destination二者至少一个有值(默认值是当前定位地址)
* 经纬度: 39.9761,116.3282
* 经纬度和名称:
* latlng:39.9761,116.3282|name:中关村 (注意:坐标先纬度,后经度)
* @param destination 终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。
* @param mode 导航模式,可选transit(公交)、driving(驾车)、walking(步行)和riding(骑行).默认:driving
* @param region 城市名或县名
* @param origin_region 起点所在城市或县
* @param destination_region 终点所在城市或县
* @param sy 公交检索策略,只针对mode字段填写transit情况下有效,值为数字。
* 0:推荐路线
* 2:少换乘
* 3:少步行
* 4:不坐地铁
* 5:时间短
* 6:地铁优先
* @param index 公交结果结果项,只针对公交检索,值为数字,从0开始
* @param target 0 图区,1 详情,只针对公交检索有效
* @param coord_type 坐标类型,可选参数,默认为bd09经纬度坐标。
* 允许的值为bd09ll、bd09mc、gcj02、wgs84。
* bd09ll表示百度经纬度坐标,
* bd09mc表示百度墨卡托坐标,
* gcj02表示经过国测局加密的坐标,
* wgs84表示gps获取的坐标
*/
private static void toBaiDuDirection(Context context, String origin, String destination, String mode
, String region, String origin_region, String destination_region
, String sy, String index, String target, String coord_type) {
StringBuffer sb = new StringBuffer("baidumap://map/direction?mode=").append(mode);
boolean isHasOrigin = false;
boolean isHasdestination = false;
if (!TextUtils.isEmpty(origin)) {
isHasOrigin = true;
sb.append("&origin=" + origin);
}
if (!TextUtils.isEmpty(destination)) {
isHasdestination = true;
sb.append("&destination=" + destination);
}
if (!isHasOrigin && !isHasdestination) {
MyToast.showShort(context, " 请输入起点或目的地");
return;
}
if (!TextUtils.isEmpty(region)) {
sb.append("®ion=" + region);
}
if (!TextUtils.isEmpty(origin_region)) {
sb.append("&origin_region=" + origin_region);
}
if (!TextUtils.isEmpty(destination_region)) {
sb.append("&destination_region=" + destination_region);
}
if (!TextUtils.isEmpty(sy)) {
sb.append("&sy=" + sy);
}
if (!TextUtils.isEmpty(index)) {
sb.append("&index=" + index);
}
if (!TextUtils.isEmpty(target)) {
sb.append("&target=" + target);
}
if (!TextUtils.isEmpty(coord_type)) {
sb.append("&coord_type=" + coord_type);
}
Intent i1 = new Intent();
i1.setData(Uri.parse(sb.toString()));
context.startActivity(i1);
}
腾讯地图
uri地址 qqmap://map/routeplan
腾讯的uri在官网文档上的我是找不到的,后来被我在这里发现了:https://github.com/xujinyang/IntentMapGuide
官网也只有http的文档,所以就参考:http://lbs.qq.com/uri_v1/guide-route.html
/**
* @param context
* @param type 公交:bus
* 驾车:drive
* 步行:walk(仅适用移动端)
* @param fromName
* @param fromcoord fromcoord=39.873145,116.413306
* @param toName
* @param tocoord
*/
public static void toTenCent(Context context, String type, String fromName, String fromcoord, String toName, String tocoord) {
StringBuffer fromTo = new StringBuffer("qqmap://map/routeplan?type=");
if (TextUtils.isEmpty(type))
type = "drive";
fromTo.append(type);
if (!TextUtils.isEmpty(fromName))
fromTo.append("&from=" + fromName);
if (!TextUtils.isEmpty(fromcoord))
fromTo.append("&fromcoord=" + fromcoord);
if (!TextUtils.isEmpty(toName))
fromTo.append("&to=" + toName);
if (!TextUtils.isEmpty(tocoord))
fromTo.append("&tocoord=" + tocoord);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
//将功能Scheme以URI的方式传入data
intent.setData(Uri.parse( fromTo.toString() ));
context.startActivity(intent);
}
效果图
这是路线规划的效果图,如果想直接调用导航就自己去看文档改下方法名就可以了
Paste_Image.png