ReactNative 调用手机地图(高德、百度)导航 Android
由于项目需要,鉴于第三方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®ion=%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的更多相关文章
- Android 调用手机上第三方百度地图并传值给地图
//移动APP调起Android百度地图方式举例 Intent intent = null; try { // intent = Intent.getIntent("intent://map ...
- Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
博客描述:后台返回地点的经纬度在地图上进行描点,点击导航弹出PopupWindow进行选择地图操作,如果手机中没有安装地图,提示没有,否则传值调起地图进行导航操作 看一下实现的效果,没图说再多都白搭 ...
- iOS 在 程序内调用手机上安装的地图软件进行导航
// 需求是需要用户 能从 所在位置 到 附近的健身房的 路线, 然而,就一个需求,不值当的添加一个地图, 就用调用手机上第三方地图软件, 什么高德, 百度, 腾讯, iOS 原生地图都可以, 如果 ...
- 百度导航试用 vs 高德导航
听说百度导航免费了,下载试用了一下: HUD模式不错,但是需要一个手机支架或挂钩.尤其是HUD景象模式,夜间把手机平放,通过前挡风玻璃反射看.这个功能有点乔布斯的感觉了. 不过路径规划还差一点,和凯立 ...
- 高德地图测两点距离android比较精确的
/////参考资料:高德官方:[http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation] 主要三 ...
- GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?
GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样? 先了解一下 高德地图 采用: GCJ-02 (不可逆) 百度百科: http://baike.baidu.com/link?url ...
- 用手机地图GPS导航费流量吗?
如果你的手机带有GPS芯片,那么使用手机导航是不会耗费手机流量的.但是如果你的手机没有GPS芯片,而使用的导航软件又是类似于移动提供的导航服务那样的导航功能,那就耗费手机流量了. 目前,导航软件导航主 ...
- Windows Store Javascript项目使用高德地图、谷歌地图、百度地图API
原文 Windows Store Javascript项目使用高德地图.谷歌地图.百度地图API 在Win8 Store 项目中可以使用的地图主要有微软的Bing Map,目前高德地图sdk也支持Wi ...
- iOS 调用第三方地图进行导航
//支持的地图 { _model = model; //支持的地图 NSMutableArray *maps = [NSMutableArray array]; //苹果原生地图-苹果原生地图方法和其 ...
随机推荐
- ubuntu14.04安装使用NviDIA显卡驱动
想给自己的ubuntu换N卡驱动的原因: 一方面,由于自己电脑在编译源代码8线程全开(make -j8)时,CPU温度呼呼涨到八九十度,从而常常导致系统保护自动关机,让人有点不爽.网上有说ubuntu ...
- 在Nginx服务器上屏蔽IP
采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走. 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现. 1.查找要屏蔽的 ...
- c json实战引擎六 , 感觉还行
前言 看到六, 自然有 一二三四五 ... 为什么还要写呢. 可能是它还需要活着 : ) 挣扎升级中 . c json 上面代码也存在于下面项目中(维护的最及时) structc json 这次版本 ...
- 开源介绍:Google Guava、Google Guice、Joda-Time
一.Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency lib ...
- rds 与mysql 进行主从同步
.rds上默认会有server-****,只需要配置从数据库: .从数据库的配置流程: .[mysqld] log-bin = mysql-bin-changelog #要和主库中的名字一样 rela ...
- BootStrap的栅格系统的基本写法(布局)
代码如下: <!DOCTYPE html> <html> <head> <title>BootStrap的基础入门</title> < ...
- Maven使用第三方jar文件的两种方法<转>
http://www.cnblogs.com/sekai/p/5932206.html 今天用上了.. ===================== 在Maven中,使用第三方库一般是通过pom.xml ...
- CentOS/RHEL Linux安装EPEL第三方软件源
https://www.vpser.net/manage/centos-rhel-linux-third-party-source-epel.html
- 关于button标签会刷新页面的问题
当button标签在form表单里面时,这时点击button按钮会提交表单刷新页面. <form action=""> <button>点击</but ...
- 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明
题目描述 “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...