第一步:
写一个判断是否安装某个app的方法
这里pkgName是你要查询的app的包名,如果不知道可以自行百度,这里我给出几个地图的app报名:
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”; // 腾讯地图包名
/**
* 判断是否安装某个应用
*/
private boolean checkAppInstalled(Context context, String pkgName) {
if (pkgName== null || pkgName.isEmpty()) {
return false;
}
final PackageManager packageManager = context.getPackageManager();
List<PackageInfo> info = packageManager.getInstalledPackages(0);
if(info == null || info.isEmpty()){
return false;
}
for ( int i = 0; i < info.size(); i++ ) {
if(pkgName.equals(info.get(i).packageName)) {
return true;
}
}
return false;
}
第二步:
写好坐标转换的方法:
调用高德地图和腾讯地图需要传入GCJ02坐标系坐标,调用百度地图需要传入BD09坐标系坐标(如果你使用的是高德地图sdk,在调用百度地图时,传给百度地图的经纬度就需要由GCJ02转换为BD09,反过来一是一样)
/**
* 调用高德地图和腾讯地图需要传入GCJ02坐标系坐标,调用百度地图需要传入BD09坐标系坐标
*
* BD-09 坐标转换成 GCJ-02 坐标
*/
public static LatLng BD2GCJ(LatLng gd) {
double x = gd.longitude - 0.0065, y = gd.latitude - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
double lng = z * Math.cos(theta);//lng
double lat = z * Math.sin(theta);//lat
return new LatLng(lat, lng);
}
/**
* GCJ-02 坐标转换成 BD-09 坐标
*/
public static LatLng GCJ2BD(LatLng gd) {
double x = gd.longitude, y = gd.latitude;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
double tempLon = z * Math.cos(theta) + 0.0065;
double tempLat = z * Math.sin(theta) + 0.006;
return new LatLng(tempLat, tempLon);
}
第三步:
当手机没有地图时去应用商店下载的方法:
**大佬原文链接:**https://blog.csdn.net/q4878802/article/details/51276642
/**
* 通过包名 在应用商店打开应用
*
* @param packageName 包名
*/
private void openApplicationMarket(String packageName) {
try {
String str = "market://details?id=" + packageName;
Intent localIntent = new Intent(Intent.ACTION_VIEW);
localIntent.setData(Uri.parse(str));
startActivity(localIntent);
} catch (Exception e) {
// 打开应用商店失败 可能是手机没有安装应用市场
e.printStackTrace();
Toast.makeText(getApplicationContext(), "打开应用商店失败", Toast.LENGTH_SHORT).show();
// 调用系统浏览器进入商城
String url = "http://app.mi.com/detail/163525?ref=search";
openLinkBySystem(url);
}
}
/**
* 调用系统浏览器打开网页
*
* @param url 地址
*/
private void openLinkBySystem(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
第四步:
开始调用方法来实现功能:
PS:这次的调用我只传入了 目的地 经纬度,出发地 地图会默认为定位的位置
大佬原文链接:https://blog.csdn.net/weimingjue/article/details/80493969
高德地图的调用(我本身用的高德地图sdk所以高德地图就不再转换坐标,你可以参照我在百度时的转换来做高德的转换):
//判断是否安装高德地图
//checkAppInstalled()是前面写的判断是否安装这个应用的方法
if (checkAppInstalled(RoutePlanningActivity.this,"com.autonavi.minimap")){
Toast.makeText(RoutePlanningActivity.this, "你安装了高德地图", Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse("amapuri://route/plan/?dlat="+endlatitude+"&dlon="+endlongititude+"&dname="+""+"&dev=0&t=0");
Intent intent=new Intent(Intent.ACTION_VIEW, uri );
startActivity(intent);
}else {
new AlertDialog.Builder(RoutePlanningActivity.this)
.setTitle("提示")
.setMessage("检测到您没有安装高德地图,是否去下载?")
.setPositiveButton("去下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
openApplicationMarket("com.autonavi.minimap");
}
})
.setNegativeButton("不了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create().show();
}
高德 Uri 可拼接的参数:
百度地图的调用:
//坐标转换
LatLng bdlatlng=GCJ2BD(new LatLng(endlatitude,endlongititude));
//判断是否安装百度地图
if (checkAppInstalled(RoutePlanningActivity.this,"com.baidu.BaiduMap")){
Toast.makeText(RoutePlanningActivity.this, "你安装了百度地图", Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse("baidumap://map/direction?destination=latlng:"+bdlatlng.latitude+","+ bdlatlng.longitude+"|name:"+""+"&mode=driving");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}else {
new AlertDialog.Builder(RoutePlanningActivity.this)
.setTitle("提示")
.setMessage("检测到您没有安装百度地图,是否去下载?")
.setPositiveButton("去下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
openApplicationMarket("com.baidu.BaiduMap");
}
})
.setNegativeButton("不了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create().show();
}
百度地图可拼接参数:
腾讯地图的调用:
大佬原文链接: https://blog.csdn.net/ever69/article/details/82427085
//判断是否安装腾讯地图
if (checkAppInstalled(RoutePlanningActivity.this,"com.tencent.map")){
Toast.makeText(RoutePlanningActivity.this, "你安装了腾讯地图", Toast.LENGTH_SHORT).show();
Uri uri=Uri.parse("qqmap://map/routeplan?type=drive&tocoord="+endlatitude+","+endlongititude+"&to="+"");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}else {
new AlertDialog.Builder(RoutePlanningActivity.this)
.setTitle("提示")
.setMessage("检测到您没有安装腾讯地图,是否去下载?")
.setPositiveButton("去下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
openApplicationMarket("com.tencent.map");
}
})
.setNegativeButton("不了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create().show();
}
腾讯地图可拼接参数: