实现目标

先来一张微信功能截图看看要做什么 

其实就是有一个目的地,点击目的地的时候弹出可选择的应用进行导航。

大脑动一下,要实现这个功能应该大体分成两步:

  1. 底部弹出可选的地图菜单进行展示
  2. 点击具体菜单某一项的时候调用对应地图的api进行导航就ok啦

底部菜单这里用PopupWindow来做。

实现

1、菜单显示 
PopupWindow支持传入view进行弹出展示,所有我们直接写一个菜单布局,高德、百度、腾讯 再加一个取消。

map_navagation_sheet.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/baidu_btn"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:background="@drawable/ulz_white_selector"
  11. android:text="百度地图"/>
  12. <include layout="@layout/common_line_view"/>
  13. <Button
  14. android:id="@+id/gaode_btn"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:background="@drawable/ulz_white_selector"
  18. android:text="高德地图"/>
  19. <include layout="@layout/common_line_view"/>
  20. <Button
  21. android:id="@+id/tencent_btn"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:background="@drawable/ulz_white_selector"
  25. android:text="腾讯地图"/>
  26. <include layout="@layout/common_line_view"/>
  27. <Button
  28. android:id="@+id/cancel_btn2"
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. android:background="@drawable/ulz_white_selector"
  32. android:text="取消"/>
  33. </LinearLayout>

这里为了显示效果,自己写了个PopupWindow的子类,一般你直接用PopupWindow就可以了。

然后在需要调用的地方显示PopupWindow


  1. mapSheetView = LayoutInflater.from(this).inflate(R.layout.map_navagation_sheet, null);
  2. mBottomSheetPop = new BottomSheetPop(this);
  3. mBottomSheetPop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
  4. mBottomSheetPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
  5. mBottomSheetPop.setContentView(mapSheetView);
  6. mBottomSheetPop.setBackgroundDrawable(new ColorDrawable(0x00000000));
  7. mBottomSheetPop.setOutsideTouchable(true);
  8. mBottomSheetPop.setFocusable(true);
  9. mBottomSheetPop.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);

2、点击每个菜单调用对用地图的导航api 
这个每个地图的官网都会有介绍,你只需要把目的地名称,经纬度信息传过去就好了,没什么多说的,直接贴代码。

  1. @Override
  2. public void onClick(View view) {
  3. switch (view.getId()) {
  4. case R.id.navigation_btn:
  5. mBottomSheetPop = new BottomSheetPop(this);
  6. mBottomSheetPop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
  7. mBottomSheetPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
  8. mBottomSheetPop.setContentView(mapSheetView);
  9. mBottomSheetPop.setBackgroundDrawable(new ColorDrawable(0x00000000));
  10. mBottomSheetPop.setOutsideTouchable(true);
  11. mBottomSheetPop.setFocusable(true);
  12. mBottomSheetPop.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
  13. break;
  14. case R.id.cancel_btn2:
  15. if (mBottomSheetPop != null) {
  16. mBottomSheetPop.dismiss();
  17. }
  18. break;
  19. case R.id.baidu_btn:
  20. if (isAvilible(this, "com.baidu.BaiduMap")) {//传入指定应用包名
  21. try {
  22. Intent intent = Intent.getIntent("intent://map/direction?" +
  23. "destination=latlng:" + mInfo.getLat() + "," + mInfo.getLng() + "|name:我的目的地" + //终点
  24. "&mode=driving&" + //导航路线方式
  25. "&src=appname#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
  26. startActivity(intent); //启动调用
  27. } catch (URISyntaxException e) {
  28. Log.e("intent", e.getMessage());
  29. }
  30. } else {//未安装
  31. //market为路径,id为包名
  32. //显示手机上所有的market商店
  33. Toast.makeText(this, "您尚未安装百度地图", Toast.LENGTH_LONG).show();
  34. Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap");
  35. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  36. if (intent.resolveActivity(getPackageManager()) != null){
  37. startActivity(intent);
  38. }
  39. }
  40. mBottomSheetPop.dismiss();
  41. break;
  42. case R.id.gaode_btn:
  43. if (isAvilible(this, "com.autonavi.minimap")) {
  44. Intent intent = new Intent();
  45. intent.setAction(Intent.ACTION_VIEW);
  46. intent.addCategory(Intent.CATEGORY_DEFAULT);
  47. //将功能Scheme以URI的方式传入data
  48. Uri uri = Uri.parse("androidamap://navi?sourceApplication=appname&poiname=fangheng&lat=" + mInfo.getLat() + "&lon=" + mInfo.getLng() + "&dev=1&style=2");
  49. intent.setData(uri);
  50. //启动该页面即可
  51. startActivity(intent);
  52. } else {
  53. Toast.makeText(this, "您尚未安装高德地图", Toast.LENGTH_LONG).show();
  54. Uri uri = Uri.parse("market://details?id=com.autonavi.minimap");
  55. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  56. if (intent.resolveActivity(getPackageManager()) != null){
  57. startActivity(intent);
  58. }
  59. }
  60. mBottomSheetPop.dismiss();
  61. break;
  62. case R.id.tencent_btn:
  63. Intent intent = new Intent();
  64. intent.setAction(Intent.ACTION_VIEW);
  65. intent.addCategory(Intent.CATEGORY_DEFAULT);
  66. //将功能Scheme以URI的方式传入data
  67. Uri uri = Uri.parse("qqmap://map/routeplan?type=drive&to=我的目的地&tocoord=" + mInfo.getLat() + "," + mInfo.getLng());
  68. intent.setData(uri);
  69. if (intent.resolveActivity(getPackageManager()) != null) {
  70. //启动该页面即可
  71. startActivity(intent);
  72. } else {
  73. Toast.makeText(this, "您尚未安装腾讯地图", Toast.LENGTH_LONG).show();
  74. }
  75. mBottomSheetPop.dismiss();
  76. break;
  77. }
  78. }

效果图

贴一下效果图 

转载自:http://www.cnblogs.com/yihoudangxian/p/7680502.html

Android 仿微信调用第三方应用导航(百度,高德、腾讯)的更多相关文章

  1. ionic3 应用内打开第三方地图导航 百度 高德

    1.安装检测第三方APP是否存在的插件 cordova plugin add cordova-plugin-appavailability --save npm install --save @ion ...

  2. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  3. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  4. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  5. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  6. android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9449737 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言 1:本文主要作为 ...

  7. 微信h5页面调用第三方位置导航

    微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参考 ...

  8. Android仿微信高效压缩图片(libjpeg)

    用过ios手机的同学应该很明显感觉到,ios拍照1M的图片要比安卓拍照排出来的5M的图片还要清晰.这是为什么呢? 这得了解android底层是如何对图片进行处理的. 当时谷歌开发Android的时候, ...

  9. Android通过微信实现第三方登录并使用OKHttp获得Token及源码下载

    这里对于App在微信开放平台上申请AppID和secret在这里就略过了,我们微信的授权登录流程,腾讯官网给的流程如下: 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用 ...

随机推荐

  1. java IO流之三 使用缓冲流来读写文件

    原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 ...

  2. Android之AssetManager使用

    1. 获取AssetManager AssetManager assetManager = context.getAssets(); 2. 列出assets文件夹下全部文件 String[] file ...

  3. formData 对象

    (1)创建的formData打印为空? var edition=$("#edinum").val();//版本号 var uploader=$("#upman" ...

  4. java设计模式 -------- 行为模式 之 策略模式(4)

    [本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 上面3节实现了从最初的对整形数组排序到最后能够对全部类型都能够依据须要定义自 ...

  5. ZOJ 1806 (小数高精度)

    题意:八进制小数转化成十进制的小数. 0.d1d2d3 ... dk [8] = 0.D1D2D3 ... Dm [10] 例: 0.75 [8] = 7*8^-1+5*8^-2 = ( 5/8 + ...

  6. 仰视源代码,实现strcmp

    //这是系统库的实现 int strcmp(const char* src, const char* dest) { int rtn = 0; while(!(rtn = *(unsigned cha ...

  7. (三)Java 开发环境配置

    window系统安装java 下载JDK   首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downl ...

  8. 【bzoj4592】[Shoi2015]脑洞治疗仪

    由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞.对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn). #include&l ...

  9. struts2 下载

    struts  官网 : https://struts.apache.org/

  10. bzoj2709: [Violet 1]迷宫花园

    二分答案,spfa check就行了. gb题卡精度. #include<cstdio> #include<iostream> #include<cstring> ...