1. 程式人生 > >Android之呼叫高德地圖或百度地圖原生app

Android之呼叫高德地圖或百度地圖原生app

今天做一個路徑規劃的功能,需要使用到高德地圖,或是百度地圖,然後想著怎樣的實現比較好。剛好也在看前程無憂,它裡面就是點選導航的話會先檢查本機是否安裝了這些地圖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);
    }
}
注:因為我這裡一開始的座標是高德地圖的座標,而它是不能用在百度地圖上的,因為兩家採用的標準不一樣,所以需要我們將高德地圖的座標轉換成百度地圖使用的座標。具體的轉換工具方法參考下方的引用。

參考: