由于项目需要,鉴于第三方sdk包的体积略大,经过评估论证后,决定采用调起APP以及网页地图的方式来进行导航。

思路:

在需要调用导航的界面通过原生获取当前手机内可用的导航app组装成列表返回到RN待选择调用,如果没有安装任何APP,则直接请求浏览器打开web版百度地图。需要注意的是,这里笔者选择百度定位sdk取得坐标,然后通过高德在线服务将百度坐标转换为高德坐标。

集成:

1、获取可用的地图列表:

    /**
* 百度地图包名
*/
public static final String PACKAGE_NAME_BD_MAP = "com.baidu.BaiduMap"; /**
* 高德地图包名
*/
public static final String PACKAGE_NAME_MINI_MAP = "com.autonavi.minimap"; @ReactMethod
public void getAvailableMapNames(final Callback callback) {
Map<String, String> names = new HashMap(); if (isAvailable(this.getCurrentActivity(), PACKAGE_NAME_BD_MAP)) {
names.put(PACKAGE_NAME_BD_MAP, "百度地图");
} if (isAvailable(this.getCurrentActivity(), PACKAGE_NAME_MINI_MAP)) {
names.put(PACKAGE_NAME_MINI_MAP, "高德地图");
} callback.invoke(JsonHelper.toJSONString(names));
}

2、选择地图,打开导航:

    /**
* @param pkgName
* @param param
*/
@ReactMethod
public void openNavMap(String pkgName, String param, final Callback callback) {
if (isBlank(param)) {
ResponseModel responseModel = new ResponseModel();
responseModel.setErrmsg("参数为空");
callback.invoke(JsonHelper.toJSONString(responseModel));
return;
} try {
JSONObject data = new JSONObject(param);
String originLat = data.get("originLat").toString();
String originLng = data.get("originLng").toString(); String destLat = data.get("destLat").toString();
String destLng = data.get("destLng").toString(); if (isBlank(pkgName)) {
// http://lbsyun.baidu.com/index.php?title=uri/api/web
String url = "http://api.map.baidu.com/direction?origin=%s,%s&destination=%s,%s&region=%s&mode=driving&output=html&src=%s";
// 打开网页
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri contentUrl = Uri.parse(String.format(url, originLat, originLng, destLat, destLng, this.getName(),
this.getName()));
intent.setData(contentUrl);
this.getCurrentActivity().startActivity(intent);
return;
} String tmpName = pkgName.trim();
if (tmpName.equals(PACKAGE_NAME_BD_MAP)) {
Intent i1 = new Intent();
// 驾车导航
i1.setData(Uri.parse(String.format("baidumap://map/navi?location=%s,%s", destLat, destLng)));
this.getCurrentActivity().startActivity(i1);
} else if (tmpName.equals(PACKAGE_NAME_MINI_MAP)) {
// http://lbs.amap.com/api/amap-mobile/guide/android/navigation
StringBuffer scheme = new StringBuffer("androidamap://navi?sourceApplication=").append(this.getName());
// if (!TextUtils.isEmpty(poiname)){
// stringBuffer.append("&poiname=").append(poiname);
// } // dev 必填 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
// style 必填 导航方式(0 速度快; 1 费用少; 2 路程短; 3 不走高速;4 躲避拥堵;5
// 不走高速且避免收费;6 不走高速且躲避拥堵;7 躲避收费和拥堵;8 不走高速躲避收费和拥堵))
scheme.append("&lat=").append(destLat).append("&lon=").append(destLng).append("&dev=").append(0)
.append("&style=").append(0); Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(scheme.toString()));
intent.setPackage("com.autonavi.minimap");
this.getCurrentActivity().startActivity(intent);
}
} catch (JSONException e) {
e.printStackTrace(); ResponseModel responseModel = new ResponseModel();
responseModel.setErrmsg("数据解析错误");
callback.invoke(JsonHelper.toJSONString(responseModel));
}
}

其中辅助检查方法为:

     /**
* 检查手机上是否安装了指定的软件
*
* @param context
* @param packageName
* 应用包名
* @return
*/
private static boolean isAvailable(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager(); // 获取所有已安装程序的包信息
List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0); // 用于存储所有已安装程序的包名
List<String> packageNames = new ArrayList<>(); // 从pinfo中将包名字逐一取出,压入pName list中
if (packageInfos != null) {
for (int i = 0; i < packageInfos.size(); i++) {
String packName = packageInfos.get(i).packageName;
packageNames.add(packName);
}
} // 判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
return packageNames.contains(packageName);
}

检查手机上是否安装了指定的软件

然后在RN界面显示列表调用代码即可。

ReactNative 调用手机地图(高德、百度)导航 Android的更多相关文章

  1. Android 调用手机上第三方百度地图并传值给地图

    //移动APP调起Android百度地图方式举例 Intent intent = null; try { // intent = Intent.getIntent("intent://map ...

  2. Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能

    博客描述:后台返回地点的经纬度在地图上进行描点,点击导航弹出PopupWindow进行选择地图操作,如果手机中没有安装地图,提示没有,否则传值调起地图进行导航操作 看一下实现的效果,没图说再多都白搭 ...

  3. iOS 在 程序内调用手机上安装的地图软件进行导航

    // 需求是需要用户 能从 所在位置 到 附近的健身房的 路线, 然而,就一个需求,不值当的添加一个地图, 就用调用手机上第三方地图软件,  什么高德, 百度, 腾讯, iOS 原生地图都可以, 如果 ...

  4. 百度导航试用 vs 高德导航

    听说百度导航免费了,下载试用了一下: HUD模式不错,但是需要一个手机支架或挂钩.尤其是HUD景象模式,夜间把手机平放,通过前挡风玻璃反射看.这个功能有点乔布斯的感觉了. 不过路径规划还差一点,和凯立 ...

  5. 高德地图测两点距离android比较精确的

    /////参考资料:高德官方:[http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation] 主要三 ...

  6. GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?

    GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样? 先了解一下 高德地图 采用: GCJ-02 (不可逆) 百度百科: http://baike.baidu.com/link?url ...

  7. 用手机地图GPS导航费流量吗?

    如果你的手机带有GPS芯片,那么使用手机导航是不会耗费手机流量的.但是如果你的手机没有GPS芯片,而使用的导航软件又是类似于移动提供的导航服务那样的导航功能,那就耗费手机流量了. 目前,导航软件导航主 ...

  8. Windows Store Javascript项目使用高德地图、谷歌地图、百度地图API

    原文 Windows Store Javascript项目使用高德地图.谷歌地图.百度地图API 在Win8 Store 项目中可以使用的地图主要有微软的Bing Map,目前高德地图sdk也支持Wi ...

  9. iOS 调用第三方地图进行导航

    //支持的地图 { _model = model; //支持的地图 NSMutableArray *maps = [NSMutableArray array]; //苹果原生地图-苹果原生地图方法和其 ...

随机推荐

  1. Asia-Dhaka 2017

    Asia-Dhaka 2017 A - Brick Walls 题目描述:如下图,编坐标与路径,给出两个坐标,问两个坐标的最短距离是多少. solution 先阶梯型地走,然后注意"中&qu ...

  2. hdu 2852 KiKi's K-Number (线段树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2852 题意: 一个容器,三种操作: (1) 加入一个数 e (2) 删除一个数 e,如果不存在则输出 No Elment! (3) 查 ...

  3. oracle日期格式转换 to_date()

    与date操作关系最大的就是两个转换函数:to_date(),to_char()       to_date() 作用将字符类型按一定格式转化为日期类型:       具体用法:to_date(''2 ...

  4. MemCached缓存操作

    Web项目在运行时,通常需要从数据库中进行读写.随着操作数据量的增大,以及访问量的集中,数据库的负载增加,数据库响应变慢,网站访问速度变慢的情况.Memcached就是用来解决这些问题的. Memca ...

  5. HTML文件编码

    为了防止中文乱码,一般在网页头文件中加入 <meta http-equiv="Content-Type" content="text/html; charset=u ...

  6. 基于AQS实现的Java并发工具类

    本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解 ...

  7. kali&BT安装好之后无法上网(包括Wifi)或者无法获得内网IP解决方法

    大家都知道,要想进行内网渗透攻击,你必须要在那个内网里.但是大家在Vmware里安装kali的时候,大多数用户为了方便,未选择桥接模式,而是选择了使用与本机共享的IP网络当然,这样能上网,但是你的虚拟 ...

  8. 洛谷P1789【Mc生存】插火把 题解

    题目传送门 这道题目可以纯暴力: #include<bits/stdc++.h> //Minecraft 666 using namespace std; ][]; int n,m,k,a ...

  9. MVC – 15.路由机制

    15.1.路由检测插件 - RouteDebug 15.2.路由约束 15.3.命名路由 15.4.验证码 15.5.ASP.NET MVC 与 三层架构 15.6.Area区域 15.6.1.尝试将 ...

  10. python快速教程-vamei

    2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...