Android仿微信调用第三方地图应用导航(高德、百度、腾讯)

实现目标

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

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

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

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

底部菜单这里用PopupWindow来做。

实现

1、菜单显示

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

map_navagation_sheet.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">

  <Button
      android:id="@+id/baidu_btn"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/ulz_white_selector"
      android:text="百度地图"/>
  <include layout="@layout/common_line_view"/>

  <Button
      android:id="@+id/gaode_btn"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/ulz_white_selector"
      android:text="高德地图"/>
  <include layout="@layout/common_line_view"/>
  <Button
    android:id="@+id/tencent_btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/ulz_white_selector"
    android:text="腾讯地图"/>
  <include layout="@layout/common_line_view"/>
  <Button
      android:id="@+id/cancel_btn2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/ulz_white_selector"
      android:text="取消"/>
</LinearLayout>

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

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

mapSheetView = LayoutInflater.from(this).inflate(R.layout.map_navagation_sheet, null);

mBottomSheetPop = new BottomSheetPop(this);
        mBottomSheetPop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        mBottomSheetPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        mBottomSheetPop.setContentView(mapSheetView);
        mBottomSheetPop.setBackgroundDrawable(new ColorDrawable(0x00000000));
        mBottomSheetPop.setOutsideTouchable(true);
        mBottomSheetPop.setFocusable(true);
        mBottomSheetPop.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);

2、点击每个菜单调用对用地图的导航api

这个每个地图的官网都会有介绍,你只需要把目的地名称,经纬度信息传过去就好了,没什么多说的,直接贴代码。

@Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.navigation_btn:
        mBottomSheetPop = new BottomSheetPop(this);
        mBottomSheetPop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        mBottomSheetPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        mBottomSheetPop.setContentView(mapSheetView);
        mBottomSheetPop.setBackgroundDrawable(new ColorDrawable(0x00000000));
        mBottomSheetPop.setOutsideTouchable(true);
        mBottomSheetPop.setFocusable(true);
        mBottomSheetPop.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
        break;
      case R.id.cancel_btn2:
        if (mBottomSheetPop != null) {
          mBottomSheetPop.dismiss();
        }
        break;
      case R.id.baidu_btn:
        if (isAvilible(this, "com.baidu.BaiduMap")) {//传入指定应用包名
          try {
            Intent intent = Intent.getIntent("intent://map/direction?" +
                "destination=latlng:" + mInfo.getLat() + "," + mInfo.getLng() + "|name:我的目的地" +    //终点
                "&mode=driving&" +     //导航路线方式
                "&src=appname#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
            startActivity(intent); //启动调用
          } catch (URISyntaxException e) {
            Log.e("intent", e.getMessage());
          }
        } else {//未安装
          //market为路径,id为包名
          //显示手机上所有的market商店
          Toast.makeText(this, "您尚未安装百度地图", Toast.LENGTH_LONG).show();
          Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap");
          Intent intent = new Intent(Intent.ACTION_VIEW, uri);
          if (intent.resolveActivity(getPackageManager()) != null){
            startActivity(intent);
          }
        }
        mBottomSheetPop.dismiss();
        break;
      case R.id.gaode_btn:
        if (isAvilible(this, "com.autonavi.minimap")) {
          Intent intent = new Intent();
          intent.setAction(Intent.ACTION_VIEW);
          intent.addCategory(Intent.CATEGORY_DEFAULT);

          //将功能Scheme以URI的方式传入data
          Uri uri = Uri.parse("androidamap://navi?sourceApplication=appname&poiname=fangheng&lat=" + mInfo.getLat() + "&lon=" + mInfo.getLng() + "&dev=1&style=2");
          intent.setData(uri);

          //启动该页面即可
          startActivity(intent);
        } else {
          Toast.makeText(this, "您尚未安装高德地图", Toast.LENGTH_LONG).show();
          Uri uri = Uri.parse("market://details?id=com.autonavi.minimap");
          Intent intent = new Intent(Intent.ACTION_VIEW, uri);
          if (intent.resolveActivity(getPackageManager()) != null){
            startActivity(intent);
          }
        }
        mBottomSheetPop.dismiss();
        break;
      case R.id.tencent_btn:
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        Uri uri = Uri.parse("qqmap://map/routeplan?type=drive&to=我的目的地&tocoord=" + mInfo.getLat() + "," + mInfo.getLng());
        intent.setData(uri);
        if (intent.resolveActivity(getPackageManager()) != null) {
          //启动该页面即可
          startActivity(intent);
        } else {
          Toast.makeText(this, "您尚未安装腾讯地图", Toast.LENGTH_LONG).show();
        }
        mBottomSheetPop.dismiss();
        break;
    }
  }

效果图

贴一下效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-10-18

[Android] 通过GridView仿微信动态添加本地图片示例代码

前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲! 一. 实现效果 主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看

Android高德地图poi检索仿微信发送位置实例代码

最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下: 从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址.我们进行了如下操作: 我们点击列表的item,中心标记会移动到该item对象的地址上面去. 我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化. 根据

Android基于高德地图poi的仿微信获取位置功能实例代码

1.打开页面自动定位,同时搜索周边所有poi 2.点击搜索按钮,输入关键子,获取关键字搜索结果 3.选取listview中的一项即可定位到该位置,或者获取任何消息 4.文件类 1.MapActivity public class MapActivity extends Activity implements PoiSearch.OnPoiSearchListener { private MapView mMapView = null; private AMap aMap; private MyL

利用百度地图Android sdk高仿微信发送位置功能及遇到的问题

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出 1.在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapView中央,怎么实现? 其实这很容易实现,只要MapView的布局文件中,将一个ImageView覆盖在MapView的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageView)总固定总MapView中央 2.如何获取MapView中央

react native 仿微信聊天室实例代码

一.前言 9月,又到开学的季节.为每个一直默默努力的自己点赞!最近都沉浸在react native原生app开发中,之前也有使用vue/react/angular等技术开发过聊天室项目,另外还使用RN技术做了个自定义模态弹窗rnPop组件. 一.项目简述 基于react+react-native+react-navigation+react-redux+react-native-swiper+rnPop等技术开发的仿微信原生App界面聊天室--RN_ChatRoom,实现了原生app启动页.As

Android TV开发:实现3D仿Gallery效果的实例代码

本文讲述了Android TV开发:实现3D仿Gallery效果的实例代码.分享给大家供大家参考,具体如下: 1.实现效果: 滚动翻页+ 页面点击+页码指示器+焦点控制 2.实现这个效果之前必须要了解 Android高级图片滚动控件实现3D版图片轮播器这篇文章,我是基于他的代码进行修改的,主要为了移植到电视上做了按键事件和焦点控制. 3.具体代码: public class Image3DSwitchView extends LinearLayout { private int currentP

iOS 高德地图仿微信发送实时位置

最近项目中要写一个微信那种发送位置的功能.具体功能在于: - 定位到当前位置 - 可定位当前位置附近的Poi - 可自行搜索目标位置,并展示附近的poi - 选择当前位置或者选择目标位置进行发送 一.准备工作 1.首先去高德地图官网下载相关的SDK(如下图): 2.按照高德地图官网的步骤继续添加所需要的依赖库 3.根据项目的bundleID前往高德地图API中创建引用并申请相关的key 高德地图应用管理后台 到这一步前期的准备工作基本差不多了,当然,我这写的不是很具体,详细的引入高德地图SDK还

Android仿微信发送语音消息的功能及示例代码

微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)

先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRecoderUtils { //文件路径 private String filePath; //文件夹路径 private String FolderPath; private MediaRecorder mMediaRecorder; private final String TAG = "fan&q

Android 百度地图POI搜索功能实例代码

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

关于Android高德地图的简单开发实例代码(DEMO)

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab