Android应用调用第三方地图应用导航
项目中需要用到调用第三方地图应用导航时可参考,类似于这样:
首先需要获取到手机上已安装的地图应用:
//获取地图应用 private AllTwoDTO.txt_mydata getMapApk() { AllTwoDTO.txt_mydata mydata = new AllTwoDTO.txt_mydata(); List<AllTwoDTO.txt_list> mydataList = new ArrayList<>(); List<String> apkList = Utils.getApkList(this); if (apkList.contains("com.baidu.BaiduMap")){ AllTwoDTO.txt_list txtList1 = new AllTwoDTO.txt_list(); txtList1.setTxt_one(TYPE_B); txtList1.setTxt_two("百度地图"); mydataList.add(txtList1); } if (apkList.contains("com.autonavi.minimap")){ AllTwoDTO.txt_list txtList2 = new AllTwoDTO.txt_list(); txtList2.setTxt_one(TYPE_A); txtList2.setTxt_two("高德地图"); mydataList.add(txtList2); } if (apkList.contains("com.tencent.map")){ AllTwoDTO.txt_list txtList3 = new AllTwoDTO.txt_list(); txtList3.setTxt_one(TYPE_T); txtList3.setTxt_two("腾讯地图"); mydataList.add(txtList3); } mydata.setTxt_list(mydataList); return mydata; }
/** * @author Administrator * @time 2018/3/5 14:42 * @describe 获取所有已安装应用 */ public static List<String> getApkList(Context context) { //获取packagemanager final PackageManager packageManager = context.getPackageManager(); //获取所有已安装程序的包信息 List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0); //用于存储所有已安装程序的包名 List<String> packageNames = new ArrayList<String>(); //从pinfo中将包名字逐一取出,压入pName list中 if (packageInfos != null) { for (int i = 0; i < packageInfos.size(); i++) { String packName = packageInfos.get(i).packageName; packageNames.add(packName); } } return packageNames; }
获取到地图应用列表做展示给用户选择,接下来才是重点,调用地图应用导航:
Intent intent; switch (data.getStringExtra(ChoiceItemActivity.ID)) { case TYPE_A://高德地图 try { intent = Intent.getIntent("androidamap://route?sourceApplication=" + getResources().getString(R.string.app_name) + "&sname=我的位置&dlat=" + ShopLatitude + "&dlon=" + ShopLongitude + "&dname=" + getIntent().getStringExtra(SHOP_TITLE) + "&dev=1&m=2&t=3"); startActivity(intent); } catch (URISyntaxException e) { showToast("您尚未安装高德地图或地图版本过低"); Uri uri = Uri.parse("market://details?id=com.autonavi.minimap"); Intent AIntent = new Intent(Intent.ACTION_VIEW, uri); startActivity(AIntent); e.printStackTrace(); } break; case TYPE_T://腾讯地图 try { intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); //将功能Scheme以URI的方式传入data Uri uri = Uri.parse("qqmap://map/routeplan?type=drive&to=" + getIntent().getStringExtra(SHOP_TITLE) + "&tocoord=" + ShopLatitude + "," + ShopLongitude); intent.setData(uri); startActivity(intent); } catch (Exception e) { showToast("您尚未安装腾讯地图或地图版本过低"); Uri uri = Uri.parse("market://details?id=com.tencent.map"); Intent TIntent = new Intent(Intent.ACTION_VIEW, uri); startActivity(TIntent); e.printStackTrace(); } break; case TYPE_B://百度地图 // 自定义打点 try { intent = new Intent(); double[] doubles = MapUtils.gaoDeToBaidu(ShopLatitude, ShopLongitude); intent.setData(Uri.parse("baidumap://map/marker?location=" + doubles[0] + "," + doubles[1] + "&title=" + getIntent().getStringExtra(SHOP_TITLE) + "&content=" + getIntent().getStringExtra(SHOP_PHONE) + "&traffic=on")); // intent.setData(Uri.parse("baidumap://map/marker?location=" + getIntent().getStringExtra(LAT) + "," + getIntent().getStringExtra(LNG) // + "&title=" + getIntent().getStringExtra(SHOP_TITLE) // + "&content=" + getIntent().getStringExtra(SHOP_PHONE) + "&traffic=on")); startActivity(intent); } catch (Exception e) { showToast("您尚未安装百度地图或地图版本过低"); Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap"); Intent BIntent = new Intent(Intent.ACTION_VIEW, uri); startActivity(BIntent); e.printStackTrace(); } break; default: break; }
ShopLatitude, ShopLongitude //经纬度信息
注意:在调用百度地图时传递的坐标信息是做转换了,因为高德和腾讯地图用的是国家标准的火星坐标,而百度用的是百度自己加密的百度坐标,而服务器上返回的是高德的火星坐标,如果不做转化,百度地图定位惠友偏差。转化方法如下:
/** * @author Administrator * @time 2018/5/14 13:34 * @describe 百度转高德(百度坐标bd09ll–>火星坐标gcj02ll) */ public static double[] bdToGaoDe(double bd_lat, double bd_lon) { double x_pi = 3.14159265358979324 * 3000.0 / 180.0; double x = bd_lon - 0.0065, y = bd_lat - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); double tempLon = z * Math.cos(theta); double tempLat = z * Math.sin(theta); double[] gps = {tempLat, tempLon}; return gps; } /** * @author Administrator * @time 2018/5/14 13:35 * @describe 高德转百度(火星坐标gcj02ll–>百度坐标bd09ll) */ public static double[] gaoDeToBaidu(double gd_lat, double gd_lon) { double x_pi = 3.14159265358979324 * 3000.0 / 180.0; double x = gd_lon, y = gd_lat; double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); double tempLon = z * Math.cos(theta) + 0.0065; double tempLat = z * Math.sin(theta) + 0.006; double[] gps = {tempLat, tempLon}; return gps; }