Android之呼叫高德地圖或百度地圖原生app
阿新 • • 發佈:2019-02-20
今天做一個路徑規劃的功能,需要使用到高德地圖,或是百度地圖,然後想著怎樣的實現比較好。剛好也在看前程無憂,它裡面就是點選導航的話會先檢查本機是否安裝了這些地圖app,如果有的話,就直接開啟使用,沒有的話就通過瀏覽器去開啟百度的web地圖進行路徑規劃。
主要的流程是這樣,先判斷是否安裝了高德地圖,有的話就開啟高德地圖app;否則就判斷是否有百度地圖;否的話就直接用瀏覽器跳轉到高德地圖的網頁做路徑規劃:
相應地圖的呼叫都有它們自己的寫法,可以去官網上查閱。我這裡有些是少了個起點,因為我的起點是定位獲得的,如果我不寫的話,它們會預設起點是定位的位置。if(PackageManagerUtil.haveGaodeMap()){ openGaodeMapToGuide(); } else if(PackageManagerUtil.haveBaiduMap()){ openBaiduMapToGuide(); }else { openBrowserToGuide(); }
private void openBaiduMapToGuide() { Intent intent = new Intent(); double[] location = GPSUtil.gcj02_To_Bd09(locationX , locationY); String url = "baidumap://map/direction?" + "destination=name:"+storeName+"|latlng:"+location[0] + "," + location[1]+ "&mode=transit&sy=3&index=0&target=1"; Uri uri = Uri.parse(url); //將功能Scheme以URI的方式傳入data intent.setData(uri); //啟動該頁面即可 startActivity(intent); } private void openGaodeMapToGuide() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); String url = "androidamap://route?sourceApplication=amap&slat="+currLocationX+"&slon="+currLocationY +"&dlat="+locationX+"&dlon="+locationY+"&dname="+storeName+"&dev=0&t=1"; Uri uri = Uri.parse(url); //將功能Scheme以URI的方式傳入data intent.setData(uri); //啟動該頁面即可 startActivity(intent); } private void openBrowserToGuide() { String url = "http://uri.amap.com/navigation?to=" + locationY + "," + locationX + "," + storeName + "&mode=car&policy=1&src=mypage&coordinate=gaode&callnative=0"; Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); }
注:因為我這裡一開始的座標是高德地圖的座標,而它是不能用在百度地圖上的,因為兩家採用的標準不一樣,所以需要我們將高德地圖的座標轉換成百度地圖使用的座標。具體的轉換工具方法參考下方的引用。public class PackageManagerUtil { private static PackageManager mPackageManager = TheApp.instance.getPackageManager(); private static List<String> mPackageNames = new ArrayList<>(); private static final String GAODE_PACKAGE_NAME = "com.autonavi.minimap"; private static final String BAIDU_PACKAGE_NAME = "com.baidu.BaiduMap"; private static void initPackageManager(){ List<PackageInfo> packageInfos = mPackageManager.getInstalledPackages(0); if (packageInfos != null) { for (int i = 0; i < packageInfos.size(); i++) { mPackageNames.add(packageInfos.get(i).packageName); } } } public static boolean haveGaodeMap(){ initPackageManager(); return mPackageNames.contains(GAODE_PACKAGE_NAME); } public static boolean haveBaiduMap(){ initPackageManager(); return mPackageNames.contains(BAIDU_PACKAGE_NAME); } }
參考: