现在,移动应用中集成地图已经成为一种趋势。导航 - 作为地图中不可或缺的一项功能,被很多移动应用所青睐,然而,导航方式选择上,为了减少不必要的资源和apk容量,一般应用都选择通过调用第三方的地图应用来实现导航功能。在介绍之前,先看一下最终效果:


  本文主要提供几种常用的调起三方地图应用的导航平台,以高德,百度,腾讯,谷歌地图为例。

地图平台 Uri文档
高德地图 http://lbs.amap.com/api/uri-api/guide/travel/route
百度地图 http://lbsyun.baidu.com/index.php?title=uri/api/android
谷歌地图 https://developers.google.com/maps/documentation/android-api/intents
腾讯地图 http://lbs.qq.com/uri_v1/guide-route.html

  各大地图服务商基本都提供了Uri,方便其他应用调用(除了腾讯),uri网址如上所示.

基本看了以上的文档就会使用了,下面就提供几个平台的基本写法吧:

  • 高德地图导航:

      高德地图较为特殊,其他地图平台都可以选择传入地址或者经纬度作为参数,而高德要求必须有经纬度。没办法,那就先撸个地理编码的轮子吧,方便我们将地址信息转化为准确的经纬度坐标,具体看下面代码:

/*** by moos on 2017/09/18* func:调用高德地图的地理编码接口,返回经纬度坐标* @param address*/private void translateAddressToLocation(String address){OkHttpUtils.get().url(GEOCODE_HTTP_URL + "address="+address+"&key="+SELF_AMAP_KEY).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int id) {Log.e("地理编码失败=", e.getMessage());//DialogUtils.dismissProgressDialog();Toast.makeText(UnityScanActivity.this, getString(R.string.act_qr_code_fail), Toast.LENGTH_LONG).show();}@Overridepublic void onResponse(String response, int id) {Logger.e("地理编码结果 =" + response);resultBean = JSONObject.parseObject(response, GeocodeResultBean.class);if (resultBean.getStatus().equals("1")) {locationList = resultBean.getGeocodes();if(locationList!=null && locationList.size()>0){//默认获取第一条locationString = locationList.get(0).getLocation();lon = locationString.substring(0,locationString.indexOf(","));lat = locationString.substring(locationString.indexOf(",")+1,locationString.length());Log.e("经纬度信息为===",lon+"======="+lat);}else {Toast.makeText(UnityScanActivity.this, "无相关信息", Toast.LENGTH_LONG).show();}} else {Toast.makeText(UnityScanActivity.this, resultBean.getInfo(), Toast.LENGTH_LONG).show();}}});}

  这里我并没有采用高德包中的地理编码接口来实现,而是调用的其web接口。请原谅我的任性,最近接口调上瘾了��,值得注意的是,url中需要传入key,这个要在高德官网自己创建web应用申请,不过很方便,不需要包名和sha1等。

下面看看如何调起手机中的高德地图吧:

//调起导航的uriprivate final String BAIDU_MAP_NAVI_URI = "baidumap://map/navi?query=";private final String GAODE_MAP_NAVI_URI = "androidamap://navi?sourceApplication=";private final String GOOGLE_MAP_NAVI_URI = "google.navigation:q=";//map app包名private final String BAIDU_MAP_APP = "com.baidu.BaiduMap";private final String GAODE_MAP_APP = "com.autonavi.minimap";private final String GOOGLE_MAP_APP = "com.google.android.apps.maps";private final String QQ_MAP_URL = "http://apis.map.qq.com/uri/v1/routeplan?type=drive&";//高德web服务的临时key(用于地理编码)private final String SELF_AMAP_KEY = "your key";private final String GEOCODE_HTTP_URL = "http://restapi.amap.com/v3/geocode/geo?";private GeocodeResultBean resultBean;private List<GeocodeResultBean.GeocodeBean> locationList;private String locationString;private String lon;private String lat;
/*** by moos on 2017/09/18* func:调起高德导航* @param lat 纬度* @param lon 经度* @param dev 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)* @param style 导航方式(0 速度快; 1 费用少; 2 路程短; 3 不走高速;4 躲避拥堵;5 不走高速且避免收费;6 不走高速且躲避拥堵;7 躲避收费和拥堵;8 不走高速躲避收费和拥堵)*/private void goNaviByGaoDeMap(String lat,String lon,String dev,String style){Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);//将功能Scheme以URI的方式传入dataUri uri = Uri.parse(GAODE_MAP_NAVI_URI +"Test"+ "&lat=" + lat+ "&lon=" + lon+ "&dev=" + dev+ "&style=" +style);intent.setData(uri);intent.setPackage("com.autonavi.minimap");startActivity(intent);}

注释比较详细了,就不做具体讲解了,可以参考官方提供的文档。

  • 百度地图导航:
/*** by moos on 2017/09/18* func:调起百度导航*/private void goNaviByBaiDuMap(String address){Intent intent = new Intent();intent.setData(Uri.parse(BAIDU_MAP_NAVI_URI + address));startActivity(intent);}
  • 谷歌地图导航:
/*** by moos on 2017/09/18* func:调起谷歌导航* @param lat* @param lon*/private void goNaviByGoogleMap(String lat,String lon,String address){Uri uri = Uri.parse(GOOGLE_MAP_NAVI_URI+lat+","+lon +"," + address);Intent mapIntent = new Intent(Intent.ACTION_VIEW, uri);mapIntent.setPackage("com.google.android.apps.maps");context.startActivity(mapIntent);}
  • 腾讯地图导航:
      刚刚说过,腾讯地图目前还未支持其他应用以uri形式调起腾讯自家的地图功能,不过我们可以通过web 接口方式调用,具体代码如下,比较简单:
/*** by moos on 2017/09/18* func:通过网页形式调起腾讯地图* @param startPoint* @param endPoint* @param policy 规划策略(0:快捷,1:无高速,2:距离短)* @param appName 当前应用的名称*/private void goNaviByTencentMap(String startPoint,String endPoint,String policy,String appName){Uri uri = Uri.parse(QQ_MAP_URL + "from="+startPoint + "&to=" +endPoint + "&policy="+policy + "&referer="+appName );Intent intent = new Intent(Intent.ACTION_VIEW,uri);startActivity(intent);}

我们只需要在url中传入参数,然后访问该网址就可以,很简单吧��。

  • 其他:
      为了更好的用户体验,我们会加上一些提醒用户的交互,如:用户手机没有安装地图应用,可以弹窗让用户前往商店下载,来吧,一大波代码来袭:
/*** by moos on 2017/09/18* func:接受导航请求,并发起导航*/private void navigateForDestination(){if(isApplicationInstall(GAODE_MAP_APP)){//安装了高德mapLog.e("Tminstore","已安装高德地图");translateAddressToLocation("东方明珠");//地理编码goNaviByGaoDeMap(lat,lon,"1","2");//goNaviByTencentMap(MyApplication.mapLocation.getAddress(),"上海东方明珠","0","com.ucardstore.Activity");}else if(isApplicationInstall(BAIDU_MAP_APP)){//安装了百度mapLog.e("Tminstore","已安装百度地图");goNaviByBaiDuMap("上海东方明珠");}else if(isApplicationInstall(GOOGLE_MAP_APP)){//安装了google mapLog.e("Tminstore","已安装谷歌地图");goNaviByGoogleMap("","","上海东方明珠");}else {//默认安装高德appshowInstallAppTip();//使用腾讯网页地图(可选)//goNaviByTencentMap(MyApplication.mapLocation.getAddress(),"上海东方明珠","0","com.ucardstore.Activity");}}...../*** by moos on 2017/09/18* func:判断手机是否安装了该应用* @param packageName* @return*/private boolean isApplicationInstall(String packageName){return new File("/data/data/" + packageName).exists();}....../*** by moos on 2017/09/18* func:安装地图app的提示*/private void showInstallAppTip(){TipDialog dialog = new TipDialog(this, new View.OnClickListener() {@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.dialog_btn_sure:Intent intent ;Uri uri = Uri.parse("market://details?id=com.autonavi.minimap");intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);break;case R.id.dialog_btn_cancel:break;}}});dialog.setMessage(getString(R.string.install_app_tip));dialog.setBtnSure(getString(R.string.go_to_install));dialog.setBtnCancel(getString(R.string.cancel));dialog.show();}

  好了,这差不多就是全部代码了,至于弹窗TipDialog是我自定义的dialog,没什么难度,就不贴出来��。
  最后,打一波广告,欢迎大家下载新潮的AR定制应用Tminstore来体验,也欢迎大家反馈问题��。

Android项目中调起手机地图导航相关推荐

  1. 微信小程序调用地图和跟据经纬度打开手机地图导航

    微信小程序调用地图和跟据经纬度打开手机地图导航 第一步:输入地址位置 wxml<button bindtap="onChooseLocation">打开地图</b ...

  2. 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析

    Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...

  3. ANDROID项目中嵌入高德地图(一)配置环境+显示地图

    最近在做项目中嵌入高德地图的工作,觉得有必要记录一下嵌入过程,虽然高德官方给说明文档了,但有写并不明确需要去查类,查资料,再此把过程记录一下. 一.显示地图 1.配置AndroidManifest.x ...

  4. marker 头像 高德地图_手机地图导航软件高德地图1.如何下载高德地图

    大家在使用手机地图的时候必须开启GPS定位服务,如不开启会定位失败 点击我查看如何开启手机GPS定位服务 如果会开启GPS定位服务的可直接点击观看以下文章 高德地图是国内一流的免费地图导航产品,也是基 ...

  5. 关于H5项目简单调用手机地图

    h5项目开发中遇到如下需求 点击导航去这里,打开浏览器地图导航.如图 实现方式: 都是直接使用a标签 1. 使用百度地图((可以传经纬度,也可以传中文地址) 遇到的问题:zoom参数配置不起作用 参考 ...

  6. uniapp 微信小程序调用手机地图导航到目标点

    如果你的页面已经获取过用户的定位权限,这么写 toAddress(position,positionAddress){let arr = position.split(',')const latitu ...

  7. android 跳转腾讯地图导航,Android 跳转到百度、高德、腾讯地图导航

    项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...

  8. android 跳转腾讯地图导航,Android 地图跳转到百度、高德、腾讯导航

    项目中遇到的一个需求,跳转外部App进行步行导航.分别是百度.高德.腾讯. 东西不难但是每次都要去官方文档找(有时候会更新一些字段). 所以在此做下记录和分享. 腾讯地图 try { LatLng l ...

  9. android开发时华为手机底部导航栏挡住了应用布局

    原因:使用安卓的BottomNavigationView控件开发底部导航栏同时使用了沉浸式状态栏导致华为手机的底部导航栏会盖住我应用的导航栏. 解决:先写一个工具类 import android.co ...

最新文章

  1. 御水.20180506
  2. php tr 用法,Linux_Linux系统中tr命令删除和替换文本字符的基本用法,通过使用 tr,您可以非常容易 - phpStudy...
  3. SpringBoot(二):设置springboot同一接口程序启动入口
  4. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列
  5. javascript onsubmit返回false仍然能提交_JavaScript对象-Get和Put
  6. 对ASCALL码的理解
  7. mongodb的返回(2)
  8. python怎么识别log函数_python中对数函数怎么表示
  9. frame中src怎么设置成一个变量_OpenCV图像人脸检测及视频中的人脸检测(附源码)...
  10. 超燃!高效 MacBook 工作环境配置,超实用!
  11. 华硕x450jn拆机_自己动手丨 轻松搞定华硕X450JN笔记本 内存扩展
  12. 如何删除win10更新文件并彻底解决win10自动更新问题?
  13. C# WPF MVVM 实战 – 2.2
  14. uniapp中app、h5、小程序引入高德地图定位,并封装起来调用。
  15. 昨天偷懒了(⊙o⊙),好气啊,那今天就补上昨天的吧,orz向大佬们低头。还是熟悉的味道。
  16. 基于jquery复刻一个月饼版地狱死神小游戏
  17. 京东移动端首页-流式布局
  18. 【GIS | WebGis的对比】Webgis地图框架的对比
  19. 三菱服务器显示rb是什么故障,三菱变频器常见的故障代码 以及故障说明
  20. 洛谷P2071 座位安排

热门文章

  1. 月签电子合同3万+份,电子合同助力高空作业租赁商“大黄蜂”数字化
  2. ROS学习笔记------ROS机器人系统设计-----基础编程 day 7 2019/3/2 帅某(URDF机器人建模,urdf功能包的建立,urdf相关模型建立代码已经上传)
  3. 文库 转换html5,使用HTML5 转换彩色图片为黑白色
  4. 【实操版】用户分层,这样做会更合理!
  5. 安卓手机如何清除密码?
  6. 机器学习预测明星出轨概率
  7. 动动动动起来了!可交互内容玩法技术揭秘
  8. GIT底层命令之git cat-file
  9. 毫米波太赫兹通信系统功耗设计
  10. 电子招标采购系统源码项目说明+开发类型+解决方案+功能描述