现在,移动应用中集成地图已经成为一种趋势。导航 - 作为地图中不可或缺的一项功能,被很多移动应用所青睐,然而,导航方式选择上,为了减少不必要的资源和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. codeforces685B
  2. Java数据结构与算法:红黑树
  3. linux设置挂载服务端防火墙_Linux Tomcat使用之前预配置(端口开放关闭 防火墙设置 硬盘挂载 安装文件)...
  4. Java实现用时间戳重命名上传的文件
  5. redis安装包_redis安装与调优部署文档(WinServer)
  6. 5000起步没商量!vivo NEX 3S 5G手机正式发布:骁龙865+无界瀑布屏加持
  7. astr在python_python学习之初识字符串
  8. MaxScale中间件部署数据库读写分离
  9. c 数组上限_高级I/O复用技术:Epoll的使用及一个完整的C实例含代码
  10. PHP 常见header 状态
  11. (Linux学习笔记一:压缩)[20180209]
  12. Linux上的查找命令之locate查找
  13. Codeforces 1071 C - Triple Flips
  14. c语言互质欧拉函数,互质与欧拉函数
  15. mysql ignore用法_MySQL中的insert ignore into, replace into等的一些用法总结
  16. 手机CPU天梯图2021年6月版
  17. 利用α-β搜索的博弈树算法编写一字棋游戏 python
  18. 4位先行进位加法器的vhdl程序_VHDL精密,Verilog简洁,但要写好都要遵守这25条通则...
  19. 陈坤VS黄晓明:用大数据解读大明星
  20. NOIP 2002 字串变换

热门文章

  1. 520有哪些值得送女友的无线蓝牙耳机?主动降噪蓝牙耳机推荐
  2. Photoshop创作动漫人像技巧【转】
  3. opencv图片合成视频提高视频清晰度参数
  4. 继续卷技术 埋头苦学,越学越会
  5. 参考df代码写的一个简单的df命令的源代码
  6. 开水果店的相关经验及学习经历,学习做水果店的流程
  7. Dcoker学习——基于centos安装docker
  8. vlc播放器文件服务器,使用vlc播放器做rtsp流媒体服务器
  9. Java开源建站工具大汇总
  10. ECSHOP编辑器【ECSHOP超级编辑器插件】全网最强编辑器