安卓实现调用三方地图导航
目錄
前言
正文
判斷是否存在應用
彈出對話框
跳轉三方地圖應用
總結
需要源碼的童鞋可以點擊下載源碼。
前言
公司項目使用的是高德地圖,之前一直用的高德地圖中的導航,但是發現使用效果很差,在差一點的機型上基本無法使用,于是決定調用第三方地圖來實現。在正文開始之前先來一個實現樣式圖吧。
需要源碼的童鞋可以直接點擊下載源碼
正文
一般來說,項目中用到的就如上圖所示的這種效果,獲取到當前位置的經緯度和目的地的經緯度,然后獲取本機是否安裝這些地圖應用,獲取到之后顯示對話框,用戶點擊之后直接跳轉到用戶所選應用實現導航。
判斷是否存在應用
那就一步一步來吧,首先來獲取當前手機是否安裝了這些三方地圖應用,想要知道手機內是否安裝了這些應用,就需要獲取到這些應用的報名,這個一百度就能知道,貼一下吧:
private static final String PN_GAODE_MAP = "com.autonavi.minimap";// 高德地圖包名private static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地圖包名private static final String PN_TENCENT_MAP = "com.tencent.map"; // 騰訊地圖包名獲取到應用包名之后只需要判斷在手機內的"/data/data"文件夾下是否存在對應包名即可判斷是否安裝了該應用,代碼很簡單,但還是貼一下吧:
private static boolean isInstallPackage(String packageName) {return new File("/data/data/" + packageName).exists();}如果需要判斷的話只需調用上面的方法然后傳入剛才的包名即可得出結果,調用方式如下:
private static boolean isGdMapInstalled() {return isInstallPackage(PN_GAODE_MAP);}這里只展示一下調用高德地圖的方式,百度和騰訊調用方式一樣。
彈出對話框
這個需要彈出底部對話框,和彈出普通對話框基本一樣,唯一的區別就是加兩行行代碼,告訴系統這個Dialog需要從底部彈出,然后即可:
bottomDialog.getWindow().setGravity(Gravity.BOTTOM);然后給對話框設置彈出動畫:
bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation);對了,上面圖片中的對話框還是透明的,這就需要給對話框設置一個樣式了,將背景顏色設置為透明的:
<!--底部對話框(地圖導航)樣式--><style name="BottomDialog" parent="@style/Base.V7.Theme.AppCompat.Light.Dialog"><item name="android:windowNoTitle">true</item><item name="android:windowBackground">@android:color/transparent</item></style>寫好樣式之后設置一下:
Dialog bottomDialog = new Dialog(context, R.style.BottomDialog);跳轉三方地圖應用
跳轉高德地圖、百度地圖、騰訊地圖需要的參數都基本一樣,都需要context來啟動activity,需要當前位置的經緯度和目的地的經緯度,還有當前位置和目的地的名稱,然后就完事了,下面是跳轉騰訊地圖的代碼:
/*** 打開騰訊地圖* params ** @param context* @param slat 起點緯度* @param slon 起點經度* @param sname 起點名稱 可不填(0,0,null)* @param dlat 終點緯度* @param dlon 終點經度* @param dname 終點名稱 必填*/public static void openTencentMap(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {String uriString = null;StringBuilder builder = new StringBuilder("qqmap://map/routeplan?type=drive&policy=0&referer=zhongshuo");if (slat != 0) {builder.append("&from=").append(sname).append("&fromcoord=").append(slat).append(",").append(slon);}builder.append("&to=").append(dname).append("&tocoord=").append(dlat).append(",").append(dlon);uriString = builder.toString();Intent intent = new Intent(Intent.ACTION_VIEW);intent.setPackage(PN_TENCENT_MAP);intent.setData(Uri.parse(uriString));context.startActivity(intent);}這里我只是簡單實現了騰訊地圖的導航功能,如果需要更多的條件帶過去的話可以去騰訊地圖的官方開發文檔查看具體參數以及字段的設置。騰訊地圖文檔:http://lbs.qq.com/uri_v1/guide-route.html
方法已經寫好了,接下來就需要調用了,調用很簡單,直接傳入需要的參數即可,上面方法中已經說明了每個參數的含義:
openTencentMap(context, slat, slon, sname, dlat, dlon, dname);下面是跳轉百度地圖導航的代碼,跳轉百度這里需要著重說明一下,對國內幾家地圖有所了解的都知道,百度用的坐標系是經過加密的一套,并不是國標、火星坐標系,所以如果需要特別精確的話需要將經緯度進行轉換,轉換成百度的坐標系,然后再進行傳值,但這不是本文的重點,本文直接使用原始坐標傳到百度地圖進行操作,特此說明。
/*** 打開百度地圖導航功能(默認坐標點是高德地圖,需要轉換)** @param context* @param slat 起點緯度* @param slon 起點經度* @param sname 起點名稱 可不填(0,0,null)* @param dlat 終點緯度* @param dlon 終點經度* @param dname 終點名稱 必填*/public static void openBaiDuNavi(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {String uriString = null;//終點坐標轉換 需要實現的在此處進行坐標轉換double destination[] = gaoDeToBaidu(dlat, dlon);dlat = destination[0];dlon = destination[1];StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");if (slat != 0) {//起點坐標轉換double[] origin = gaoDeToBaidu(slat, slon);slat = origin[0];slon = origin[1];builder.append("origin=latlng:").append(slat).append(",").append(slon).append("|name:").append(sname);}builder.append("&destination=latlng:").append(dlat).append(",").append(dlon).append("|name:").append(dname);uriString = builder.toString();Intent intent = new Intent(Intent.ACTION_VIEW);intent.setPackage(PN_BAIDU_MAP);intent.setData(Uri.parse(uriString));context.startActivity(intent);}調用方法很簡單,和剛才調用騰訊地圖的調用參數都一樣,這里就不再舉例。最后在貼一下高德地圖的調用代碼:
/*** 打開高德地圖導航功能** @param context* @param slat 起點緯度* @param slon 起點經度* @param sname 起點名稱 可不填(0,0,null)* @param dlat 終點緯度* @param dlon 終點經度* @param dname 終點名稱 必填*/public static void openGaoDeNavi(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {String uriString = null;StringBuilder builder = new StringBuilder("amapuri://route/plan?sourceApplication=maxuslife");if (slat != 0) {builder.append("&sname=").append(sname).append("&slat=").append(slat).append("&slon=").append(slon);}builder.append("&dlat=").append(dlat).append("&dlon=").append(dlon).append("&dname=").append(dname).append("&dev=0").append("&t=0");uriString = builder.toString();Intent intent = new Intent(Intent.ACTION_VIEW);intent.setPackage(PN_GAODE_MAP);intent.setData(Uri.parse(uriString));context.startActivity(intent);}總結
本文其實內容很簡單,只是將知識點串了起來,本文中涉及到的所有代碼我都放在一個Demo中了,下面是本Demo的截圖:
需要源碼的童鞋可以點擊下載源碼。
?
總結
以上是生活随笔為你收集整理的安卓实现调用三方地图导航的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么看接收灵敏度desense问题?
- 下一篇: DirectX12_基础知识