//最近项目中用到了导航 调用第三方地图进行导航(高德 百度 腾讯) 实现如下
public class MapUtil {
public static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地图包名
public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地图包名
public static final String PN_TENCENT_MAP = "com.tencent.map"; // 腾讯地图包名
public static final String GAODE_MAP = "高德地图";// 高德地图包名
public static final String BAIDU_MAP = "百度地图"; // 百度地图包名
public static final String TENCENT_MAP = "腾讯地图"; // 腾讯地图包名
/**
* 检查地图应用是否安装
*
* @return
*/
public static boolean isGdMapInstalled(Context context) {
return isInstallApk(context, PN_GAODE_MAP);
}
public static boolean isBaiduMapInstalled(Context context) {
return isInstallApk(context, PN_BAIDU_MAP);
}
public static boolean isTencentMapInstalled(Context context) {
return isInstallApk(context, PN_TENCENT_MAP);
}
/**
* 判断手机中是否安装指定包名的软件
*
* @param context
* @param pkgname 包名
*/
public static boolean isInstallApk(Context context, String pkgname) {
List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
if (packageInfo.packageName.equals(pkgname)) {
return true;
} else {
continue;
}
}
return false;
}
//地图列表
public static List<String> mapsList() {
List<String> maps = new ArrayList<>();
maps.add(PN_GAODE_MAP);
maps.add(PN_BAIDU_MAP);
maps.add(PN_TENCENT_MAP);
return maps;
}
/**
* 高德、腾讯转百度
*
* @param gd_lon
* @param gd_lat
* @return
*/
public static double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
double[] bd_lat_lon = new double[2];
double PI = Math.PI * 3000.0 / 180.0;
double x = gd_lon, y = gd_lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
return bd_lat_lon;
}
// 检索筛选后返回
public static List<String> hasMap(Context context) {
List<String> mapsList = mapsList();
List<String> backList = new ArrayList<>();
for (int i = 0; i < mapsList.size(); i++) {
boolean avilible = isInstallApk(context, mapsList.get(i));
if (avilible) {
backList.add(mapsList.get(i));
}
}
return backList;
}
/**
* 跳转到高德地图
*
* @param context
* @param latitude 纬度
* @param longitude 经度
* @param address 终点
*/
public static void goGaodeMap(Context context, double latitude, double longitude, String address) {
try {
Intent intent = Intent.getIntent("amapuri://route/plan/?sid=&dname=" + address
+ "&dlat=" + latitude
+ "&dlon=" + longitude
+ "&dev=0&t=0");
context.startActivity(intent);
} catch (URISyntaxException e) {
Log.e("goError", e.getMessage());
}
}
/**
* 跳转到百度地图
*
* @param context
* @param latitude 纬度
* @param longitude 经度
* @param address 终点
*/
public static void goBaiduMap(Context context, double latitude, double longitude, String address) {
double[] bd_lat_lon = gaoDeToBaidu(longitude, latitude);//坐标转换
try {
Intent intent = Intent.getIntent("intent://map/direction?destination=latlng:"
+ bd_lat_lon[1] + ","
+ bd_lat_lon[0] + "|name:" + address + //终点:该地址会在导航页面的终点输入框显示
"&mode=driving&" + //选择导航方式 此处为驾驶
"region=" + //
"&src=#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
context.startActivity(intent);
} catch (URISyntaxException e) {
Log.e("goError", e.getMessage());
}
}
/**
* 跳转到腾讯地图
*
* @param context
* @param latitude 纬度
* @param longitude 经度
* @param address 终点
*/
public static void goTencentMap(Context context, double latitude, double longitude, String address) {
try {
Intent intent = Intent.getIntent("qqmap://map/routeplan?type=drive&policy=0&referer=zhongshuo&to=" + address
+ "&tocoord=" + latitude + "," + longitude);
context.startActivity(intent);
} catch (URISyntaxException e) {
Log.e("goError", e.getMessage());
}
}
}