Android app喚醒第三方地圖App進(jìn)行導(dǎo)航(高德,百度,騰訊)

根據(jù)項目需要 要添加導(dǎo)航功能 由于我的app 的內(nèi)部已經(jīng)做了地圖和路線規(guī)劃 同時為了使用用戶的使用習(xí)慣 我選擇了第三方導(dǎo)航 選擇用戶已有地圖軟件進(jìn)行路線規(guī)劃和導(dǎo)航
我選擇的是目前的主流地圖app平臺 高德 百度 騰訊 三種導(dǎo)航軟件 至于google 地圖 由于某些原因 我放棄掉了

說一下我的思路
先檢索手機是否安裝了目標(biāo)地圖app(高德暮顺,百度,騰訊) 如果有安裝其中之一 提示用戶跳轉(zhuǎn)打開地圖 如果沒有安裝 提示安裝

看一下實現(xiàn)吧 相對來說很簡單 其他的就不多說了 直接上代碼

好了 為了方便大家 我把三個app 的Android技術(shù)文檔連接放在這里 供大家參考

高德navi 文檔連接 https://lbs.amap.com/api/amap-mobile/guide/android/route

gaode.png

tencent 文檔連接 https://lbs.qq.com/uri_v1/guide-route.html

baidu 文檔連接 http://lbsyun.baidu.com/index.php?title=uri/api/android

baidu.png

看了這些 思路應(yīng)該更加清楚了

下面是我編寫的工具類

// 檢索地圖軟件
public static boolean isAvilible(Context context, String packageName){
//獲取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);
}
}
//判斷packageNames中是否有目標(biāo)程序的包名捶码,有TRUE,沒有FALSE
return packageNames.contains(packageName);
}

/**
* 指定地圖
*百度地圖包名:com.baidu.BaiduMap

 高德地圖包名:com.autonavi.minimap

 騰訊地圖包名:com.tencent.map

 谷歌地圖 com.google.android.apps.maps
 *
 */
public List<String> mapsList (){
    List<String> maps = new ArrayList<>();
    maps.add("com.baidu.BaiduMap");
    maps.add("com.autonavi.minimap");
    maps.add("com.tencent.map");
    return maps;
}

// 檢索篩選后返回
public  List<String> hasMap (Context context){
    List<String> mapsList = mapsList();
    List<String> backList = new ArrayList<>();
    for (int i = 0; i < mapsList.size(); i++) {
        boolean avilible = isAvilible(context, mapsList.get(i));
       if (avilible){
           backList.add(mapsList.get(i));
       }
    }
    return backList;


}

選擇窗口 并實現(xiàn)喚醒目標(biāo)app進(jìn)行導(dǎo)航

public class MapToast {
public void showChooseMap(Context context, View rootView,HisLocationBean bean){
CommonPopupWindow popupWindow=new CommonPopupWindow.Builder(context)
.setView(R.layout.map_toast)
.setWidthAndHeight(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
.setBackGroundLevel(0.5f)
.setViewOnclickListener((view, layoutResId, popupWindow1) -> {
View map_toast_cancelbt = view.findViewById(R.id.map_toast_cancelbt);
View map_toast_gaodebt = view.findViewById(R.id.map_toast_gaodebt);
View map_toast_baidubt = view.findViewById(R.id.map_toast_baidubt);
View map_toast_tencentbt = view.findViewById(R.id.map_toast_tencentbt);
View map_toast_hinttv = view.findViewById(R.id.map_toast_hinttv);

                List<String> hasMap = new ThridMapUtil().hasMap(context);
                for (int i = 0; i < hasMap.size(); i++) {
                    if (hasMap.get(i).contains("com.autonavi.minimap")){
                        map_toast_gaodebt.setVisibility(View.VISIBLE);
                    }else if (hasMap.get(i).contains("com.baidu.BaiduMap")){
                        map_toast_baidubt.setVisibility(View.VISIBLE);
                    }else if (hasMap.get(i).contains("com.tencent.map")){
                        map_toast_tencentbt.setVisibility(View.VISIBLE);
                    }
                }
                if (hasMap.size() == 0){
                    map_toast_hinttv.setVisibility(View.VISIBLE);
                }
                map_toast_cancelbt.setOnClickListener(view1 -> {
                    popupWindow1.dismiss();
                });
                map_toast_gaodebt.setOnClickListener(view1 -> {

                    toGaodeNavi(context,bean);
                    popupWindow1.dismiss();
                });
                map_toast_baidubt.setOnClickListener(view1 -> {
                    toBaidu(context,bean);
                    popupWindow1.dismiss();

                });
                map_toast_tencentbt.setOnClickListener(view1 -> {

                    toTencent(context,bean);
                    popupWindow1.dismiss();
                });
                
            }).setOutsideTouchable(true)
            .create();
    popupWindow.showAtLocation(rootView, Gravity.BOTTOM,0,0);
}

// 百度地圖
public void toBaidu(Context context, HisLocationBean bean){
    
    Intent intent= new Intent("android.intent.action.VIEW", android.net.Uri.parse("baidumap://map/geocoder?location=" + bean.getLat() + "," + bean.getLon()));
    context.startActivity(naviIntent);
}
// 高德地圖
public void toGaodeNavi(Context context,HisLocationBean bean){
    Intent intent= new Intent("android.intent.action.VIEW", android.net.Uri.parse("androidamap://route?sourceApplication=appName&slat=&slon=&sname=我的位置&dlat="+ bean.getLat() +"&dlon="+ bean.getLon()+"&dname=目的地&dev=0&t=2"));
    context.startActivity(naviIntent);
}
// 騰訊地圖
public void toTencent(Context context,HisLocationBean bean){
    Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse("qqmap://map/routeplan?type=drive&from=&fromcoord=&to=目的地&tocoord=" + bean.getLat() + "," + bean.getLon() + "&policy=0&referer=appName"));
    context.startActivity(naviIntent);


}

}

window的xml文件

<LinearLayout
android:background="@color/color_f6f7f8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginLeft="@dimen/dp_20"
android:layout_marginRight="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_20"
android:orientation="vertical"
android:gravity="center_vertical">

    <TextView
        android:background="@color/color_FFFFFF"
        android:layout_marginTop="@dimen/dp_15"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:text="高德地圖"
        android:visibility="gone"
        android:clickable="true"
        android:id="@+id/map_toast_gaodebt"
        android:textSize="@dimen/titlesise"
        android:textColor="@color/color_626262"
        android:gravity="center" />
    <TextView
        android:background="@color/color_FFFFFF"
        android:layout_marginTop="@dimen/dp_1"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:text="百度地圖"
        android:visibility="gone"
        android:clickable="true"
        android:id="@+id/map_toast_baidubt"
        android:textSize="@dimen/titlesise"
        android:textColor="@color/color_626262"
        android:gravity="center" />
    <TextView
        android:background="@color/color_FFFFFF"
        android:layout_marginTop="@dimen/dp_1"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:text="騰訊地圖"
        android:visibility="gone"
        android:clickable="true"
        android:id="@+id/map_toast_tencentbt"
        android:textSize="@dimen/titlesise"
        android:textColor="@color/color_626262"
        android:gravity="center" />
    <TextView
        android:background="@color/color_FFFFFF"
        android:layout_marginTop="@dimen/dp_1"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:text="無法檢索地圖軟件或链,請安裝地圖軟件后再試"
        android:visibility="gone"
        android:clickable="true"
        android:id="@+id/map_toast_hinttv"
        android:textSize="@dimen/titlesise"
        android:textColor="@color/color_626262"
        android:gravity="center" />
    <TextView
        android:background="@color/color_FFFFFF"
        android:layout_marginTop="@dimen/dp_15"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_40"
        android:text="返回"
        android:clickable="true"
        android:id="@+id/map_toast_cancelbt"
        android:textSize="@dimen/titlesise"
        android:textColor="@color/color_626262"
        android:gravity="center" />
</LinearLayout>

說在最后 文中提供了google 的包名 https://developers.google.cn/maps/documentation/ 這里是google 技術(shù)文檔 感興趣朋友可以看一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫恼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澳盐,更是在濱河造成了極大的恐慌尤筐,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洞就,死亡現(xiàn)場離奇詭異盆繁,居然都是意外死亡,警方通過查閱死者的電腦和手機旬蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門油昂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倾贰,你說我怎么就攤上這事冕碟。” “怎么了匆浙?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵安寺,是天一觀的道長。 經(jīng)常有香客問我首尼,道長挑庶,這世上最難降的妖魔是什么言秸? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮迎捺,結(jié)果婚禮上举畸,老公的妹妹穿的比我還像新娘。我一直安慰自己凳枝,他們只是感情好抄沮,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岖瑰,像睡著了一般叛买。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋订,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天率挣,我揣著相機與錄音,去河邊找鬼辅辩。 笑死难礼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玫锋。 我是一名探鬼主播蛾茉,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撩鹿!你這毒婦竟也來了谦炬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤节沦,失蹤者是張志新(化名)和其女友劉穎键思,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甫贯,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡吼鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫搁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赔桌。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渴逻,靈堂內(nèi)的尸體忽然破棺而出疾党,到底是詐尸還是另有隱情,我是刑警寧澤惨奕,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布雪位,位于F島的核電站,受9級特大地震影響梨撞,放射性物質(zhì)發(fā)生泄漏雹洗。R本人自食惡果不足惜香罐,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队伟。 院中可真熱鬧穴吹,春花似錦幽勒、人聲如沸嗜侮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锈颗。三九已至,卻和暖如春咪惠,著一層夾襖步出監(jiān)牢的瞬間击吱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工遥昧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留覆醇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓炭臭,卻偏偏與公主長得像永脓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鞋仍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359