安卓实现调用三方地图导航
目錄
前言
正文
判斷是否存在應(yīng)用
彈出對話框
跳轉(zhuǎn)三方地圖應(yīng)用
總結(jié)
需要源碼的童鞋可以點(diǎn)擊下載源碼。
前言
公司項(xiàng)目使用的是高德地圖,之前一直用的高德地圖中的導(dǎo)航,但是發(fā)現(xiàn)使用效果很差,在差一點(diǎn)的機(jī)型上基本無法使用,于是決定調(diào)用第三方地圖來實(shí)現(xiàn)。在正文開始之前先來一個(gè)實(shí)現(xiàn)樣式圖吧。
需要源碼的童鞋可以直接點(diǎn)擊下載源碼
正文
一般來說,項(xiàng)目中用到的就如上圖所示的這種效果,獲取到當(dāng)前位置的經(jīng)緯度和目的地的經(jīng)緯度,然后獲取本機(jī)是否安裝這些地圖應(yīng)用,獲取到之后顯示對話框,用戶點(diǎn)擊之后直接跳轉(zhuǎn)到用戶所選應(yīng)用實(shí)現(xiàn)導(dǎo)航。
判斷是否存在應(yīng)用
那就一步一步來吧,首先來獲取當(dāng)前手機(jī)是否安裝了這些三方地圖應(yīng)用,想要知道手機(jī)內(nèi)是否安裝了這些應(yīng)用,就需要獲取到這些應(yīng)用的報(bào)名,這個(gè)一百度就能知道,貼一下吧:
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"; // 騰訊地圖包名獲取到應(yīng)用包名之后只需要判斷在手機(jī)內(nèi)的"/data/data"文件夾下是否存在對應(yīng)包名即可判斷是否安裝了該應(yīng)用,代碼很簡單,但還是貼一下吧:
private static boolean isInstallPackage(String packageName) {return new File("/data/data/" + packageName).exists();}如果需要判斷的話只需調(diào)用上面的方法然后傳入剛才的包名即可得出結(jié)果,調(diào)用方式如下:
private static boolean isGdMapInstalled() {return isInstallPackage(PN_GAODE_MAP);}這里只展示一下調(diào)用高德地圖的方式,百度和騰訊調(diào)用方式一樣。
彈出對話框
這個(gè)需要彈出底部對話框,和彈出普通對話框基本一樣,唯一的區(qū)別就是加兩行行代碼,告訴系統(tǒng)這個(gè)Dialog需要從底部彈出,然后即可:
bottomDialog.getWindow().setGravity(Gravity.BOTTOM);然后給對話框設(shè)置彈出動(dòng)畫:
bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation);對了,上面圖片中的對話框還是透明的,這就需要給對話框設(shè)置一個(gè)樣式了,將背景顏色設(shè)置為透明的:
<!--底部對話框(地圖導(dǎo)航)樣式--><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>寫好樣式之后設(shè)置一下:
Dialog bottomDialog = new Dialog(context, R.style.BottomDialog);跳轉(zhuǎn)三方地圖應(yīng)用
跳轉(zhuǎn)高德地圖、百度地圖、騰訊地圖需要的參數(shù)都基本一樣,都需要context來啟動(dòng)activity,需要當(dāng)前位置的經(jīng)緯度和目的地的經(jīng)緯度,還有當(dāng)前位置和目的地的名稱,然后就完事了,下面是跳轉(zhuǎn)騰訊地圖的代碼:
/*** 打開騰訊地圖* params ** @param context* @param slat 起點(diǎn)緯度* @param slon 起點(diǎn)經(jīng)度* @param sname 起點(diǎn)名稱 可不填(0,0,null)* @param dlat 終點(diǎn)緯度* @param dlon 終點(diǎn)經(jīng)度* @param dname 終點(diǎn)名稱 必填*/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);}這里我只是簡單實(shí)現(xiàn)了騰訊地圖的導(dǎo)航功能,如果需要更多的條件帶過去的話可以去騰訊地圖的官方開發(fā)文檔查看具體參數(shù)以及字段的設(shè)置。騰訊地圖文檔:http://lbs.qq.com/uri_v1/guide-route.html
方法已經(jīng)寫好了,接下來就需要調(diào)用了,調(diào)用很簡單,直接傳入需要的參數(shù)即可,上面方法中已經(jīng)說明了每個(gè)參數(shù)的含義:
openTencentMap(context, slat, slon, sname, dlat, dlon, dname);下面是跳轉(zhuǎn)百度地圖導(dǎo)航的代碼,跳轉(zhuǎn)百度這里需要著重說明一下,對國內(nèi)幾家地圖有所了解的都知道,百度用的坐標(biāo)系是經(jīng)過加密的一套,并不是國標(biāo)、火星坐標(biāo)系,所以如果需要特別精確的話需要將經(jīng)緯度進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成百度的坐標(biāo)系,然后再進(jìn)行傳值,但這不是本文的重點(diǎn),本文直接使用原始坐標(biāo)傳到百度地圖進(jìn)行操作,特此說明。
/*** 打開百度地圖導(dǎo)航功能(默認(rèn)坐標(biāo)點(diǎn)是高德地圖,需要轉(zhuǎn)換)** @param context* @param slat 起點(diǎn)緯度* @param slon 起點(diǎn)經(jīng)度* @param sname 起點(diǎn)名稱 可不填(0,0,null)* @param dlat 終點(diǎn)緯度* @param dlon 終點(diǎn)經(jīng)度* @param dname 終點(diǎn)名稱 必填*/public static void openBaiDuNavi(Context context, double slat, double slon, String sname, double dlat, double dlon, String dname) {String uriString = null;//終點(diǎn)坐標(biāo)轉(zhuǎn)換 需要實(shí)現(xiàn)的在此處進(jìn)行坐標(biāo)轉(zhuǎn)換double destination[] = gaoDeToBaidu(dlat, dlon);dlat = destination[0];dlon = destination[1];StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");if (slat != 0) {//起點(diǎn)坐標(biāo)轉(zhuǎn)換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);}調(diào)用方法很簡單,和剛才調(diào)用騰訊地圖的調(diào)用參數(shù)都一樣,這里就不再舉例。最后在貼一下高德地圖的調(diào)用代碼:
/*** 打開高德地圖導(dǎo)航功能** @param context* @param slat 起點(diǎn)緯度* @param slon 起點(diǎn)經(jīng)度* @param sname 起點(diǎn)名稱 可不填(0,0,null)* @param dlat 終點(diǎn)緯度* @param dlon 終點(diǎn)經(jīng)度* @param dname 終點(diǎn)名稱 必填*/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);}總結(jié)
本文其實(shí)內(nèi)容很簡單,只是將知識(shí)點(diǎn)串了起來,本文中涉及到的所有代碼我都放在一個(gè)Demo中了,下面是本Demo的截圖:
需要源碼的童鞋可以點(diǎn)擊下載源碼。
?
總結(jié)
以上是生活随笔為你收集整理的安卓实现调用三方地图导航的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么看接收灵敏度desense问题?
- 下一篇: 前端学习(3073):vue+eleme