ReactNative调用移动地图(百度高德)来导航Android

电脑杂谈  发布时间:2020-07-12 19:09:15  来源:网络整理

手机网页嵌入地图导航_手机网页地图导航代码_网页导航代码

由于项目的需要,鉴于第三方SDK软件包稍大,经过评估和分析,决定使用APP和Web地图进行导航.

在需要调用导航的界面中手机网页地图导航代码,获取当前手机中可用的导航应用程序列表手机网页地图导航代码,然后返回到要选择的RN. 如果未安装APP,则直接请求浏览器打开百度地图的网络版本. 需要说明的是,这里我选择百度定位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));
        }
    }

查看代码

手机网页地图导航代码_手机网页嵌入地图导航_网页导航代码

辅助检查方法是:

 1     /**
 2      * 检查手机上是否安装了指定的软件
 3      * 
 4      * @param context
 5      * @param packageName
 6      *            应用包名
 7      * @return
 8      */
 9     private static boolean isAvailable(Context context, String packageName) {
10         final PackageManager packageManager = context.getPackageManager();
11 
12         // 获取所有已安装程序的包信息
13         List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
14 
15         // 用于存储所有已安装程序的包名
16         List<String> packageNames = new ArrayList<>();
17 
18         // 从pinfo中将包名字逐一取出,压入pName list中
19         if (packageInfos != null) {
20             for (int i = 0; i < packageInfos.size(); i++) {
21                 String packName = packageInfos.get(i).packageName;
22                 packageNames.add(packName);
23             }
24         }
25 
26         // 判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE
27         return packageNames.contains(packageName);
28     }

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

然后可以在RN界面上显示列表调用代码.

转载于:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-277976-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 赖延年
        赖延年

        看做事一种反社会行为呢

      • 朱迪福斯特
        朱迪福斯特

        台湾自古属中国

      热点图片
      拼命载入中...