根据经纬度跳转三方app地图导航

  • Post author:
  • Post category:其他


package com.shendi.Utils;


import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.widget.Toast;

import com.shendi.View.application.MyApplication;

import java.io.File;
import java.util.List;

/**
 * Created by zhq_zhao on 2017/5/5.
 * 注意百度不需要起始位置的经纬度,而高德需要起始位置的经纬度
 * 使用第三方导航:高德、百度。。。。。。。。。。
 */
public class AmapUtil {
    private static AmapUtil mAmapUtil;
    private LocationManager locationManager;
    private String locationProvider;
    private String slat;
    private String slng;
    private  Location location;

    public AmapUtil(Context getApplicationContext) {
        //获取地理位置管理器
        locationManager = (LocationManager) getApplicationContext.getSystemService(Context.LOCATION_SERVICE);
        //获取所有可用的位置提供器
        List<String> providers = locationManager.getProviders(true);
        if(providers.contains(LocationManager.GPS_PROVIDER)){
            //如果是GPS
            locationProvider = LocationManager.GPS_PROVIDER;
        }else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
            //如果是Network
            locationProvider = LocationManager.NETWORK_PROVIDER;
        }else{
            Toast.makeText(MyApplication.context, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
            return ;
        }
        //获取Location
        location = locationManager.getLastKnownLocation(locationProvider);
        if(location !=null){
            //不为空,显示地理位置经纬度
            getLocationInfo(location);
        }
    }

    /**获取起点位置用于高德地图导航的使用
     *
     * @param location
     */
    private void getLocationInfo(Location location) {
        if (location != null) {
            //获取纬度
            slat = String.valueOf(location.getLatitude());
            //获取经度
            slng = String.valueOf(location.getLongitude());

        } else {
            Toast.makeText(MyApplication.context, "请允许定位权限", Toast.LENGTH_SHORT).show();
            return ;
        }
    }

    /**
     * 根据包名检测某个APP是否安装
     * @param packageName 包名  百度的包名为 com.baidu.BaiduMap,高德com.autonavi.minimap,腾讯
     * @return true 安装 false 没有安装
     */
    public static boolean isInstallByRead(String packageName) {
        return new File("/data/data/" + packageName).exists();
    }
    public static AmapUtil getInstance(){
        if(mAmapUtil ==null){
            mAmapUtil =new AmapUtil(MyApplication.context);
        }
        return mAmapUtil;
    }

    /**
     * 打开百度地图导航客户端
     * intent = Intent.getIntent("baidumap://map/navi?location=34.264642646862,108.95108518068&type=BLK&src=thirdapp.navi.you
     * location 坐标点 location与query二者必须有一个,当有location时,忽略query
     * query    搜索key   同上
     * type 路线规划类型  BLK:躲避拥堵(自驾);TIME:最短时间(自驾);DIS:最短路程(自驾);FEE:少走高速(自驾);默认DIS
     */
    public void openBaiduNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("baidumap://map/geocoder?location=")
                .append(lat).append(",").append(lng).append("&type=TIME");
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        intent.setPackage("com.baidu.BaiduMap");
        context.startActivity(intent);
    }
    /**
     * 打开google Web地图导航
     */
    public void openWebGoogleNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("http://ditu.google.cn/maps?hl=zh&mrt=loc&q=").append(lat).append(",").append(lng);
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        context. startActivity(i);
    }
    /**
     * 打开google地图客户端开始导航
     * q:目的地
     * mode:d驾车 默认
     */
    public void openGoogleNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("google.navigation:q=").append(lat).append(",").append(lng).append("&mode=d");
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        i.setPackage("com.google.android.apps.maps");
        context.startActivity(i);
    }


    /**
     * @param  //slat 起点
     * @param dlat 终点
     * @param dev 必填 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
     * @param t t = 1(公交) =2(驾车) =4(步行)
     * @param showType 高德导航
     * /*"androidamap://route?sourceApplication=changanchuxing"
     * + "&slat=36.2&slon=116.1&sname=abc&dlat=36.3"
     * + "&dlon=116.2&dname=def&dev=0&m=0&t=1&showType=1"
     * 高德开放平台 http://lbs.amap.com/api/uri-api/guide/android-uri-explain/route/
     */
    public  void goToGaodeNaviActivity2(Context context, String sourceApplication, String sname, String dlat, String dlon, String dname, String dev, String m,
                                             String t, String showType) {
        String locationStr = "androidamap://route?sourceApplication="
                + sourceApplication
                +
                "&slat="
                + slat
                + "&slon="
                + slng
                +
                "&sname="
                + sname
                + "&dlat="
                + dlat
                + "&dlon="
                + dlon
                + "&dname="
                + dname
                + "&dev="
                + dev
                + "&m="
                + m
                + "&t="
                + t
                + "&showType="
                + showType;
        Intent intent = new Intent("android.intent.action.VIEW",
                android.net.Uri.parse(locationStr));
        intent.setPackage("com.autonavi.minimap");
        context.startActivity(intent);
    }
}
    //-------------------------------------以下的暂时废弃不用---------------------------------------------------------------//
//
//    /**
//     * 启动BaiduApp进行导航
//     * <h3>Version</h3> 1.0
//     * <h3>CreateTime</h3> 2016/6/27,11:23
//     * <h3>UpdateTime</h3> 2016/6/27,11:23
//     * <h3>CreateAuthor</h3> luzhenbang
//     * <h3>UpdateAuthor</h3>
//     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)
//     *
//     * @param context 上下文
//     * @param origin 必选  起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。例如:
//     * latlng:34.264642646862,108.95108518068|name:我家
//     * @param destination 必选 终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。
//     * @param mode 必选 导航模式,固定为transit、driving、walking,分别表示公交、驾车和步行
//     * @param region 必选 城市名或县名 当给定region时,认为起点和终点都在同一城市,除非单独给定起点或终点的城市。
//     * @param origin_region 必选  起点所在城市或县
//     * @param destination_region 必选  终点所在城市或县
//     * @param coord_type 可选 坐标类型,可选参数,默认为bd09经纬度坐标。
//     * @param zoom 可选 展现地图的级别,默认为视觉最优级别。
//     * @param src 必选 调用来源,规则:companyName|appName。
//     */
//    /** 百度导航 */
//    public static void goToBaiduNaviActivity(Context context, String origin, String destination,
//                                             String mode, String region, String origin_region, String destination_region,
//                                             String coord_type, String zoom, String src) {
//        StringBuffer stringBuffer = new StringBuffer("intent://map/direction?origin=");
//        stringBuffer.append(origin)
//                .append("&destination=")
//                .append(destination)
//                .append("&mode=")
//                .append(mode);
//        if (!TextUtils.isEmpty(region)) {
//            stringBuffer.append("&region=").append(region);
//        }
//        if (!TextUtils.isEmpty(origin_region)) {
//            stringBuffer.append("&origin_region=").append(origin_region);
//        }
//        if (!TextUtils.isEmpty(destination_region)) {
//            stringBuffer.append("&destination_region=").append(destination_region);
//        }
//        if (!TextUtils.isEmpty(coord_type)) {
//            stringBuffer.append("&coord_type=").append(coord_type);
//        }
//
//        if (!TextUtils.isEmpty(zoom)) {
//            stringBuffer.append("&zoom=").append(zoom);
//        }
//        stringBuffer.append("&src=")
//                .append(src)
//                .append("#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
//        String intentString = stringBuffer.toString();
//        try {
//            Intent intent = Intent.getIntent(intentString);
//            context.startActivity(intent);
//        } catch (URISyntaxException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /***
//     * @param originlat 起点维度
//     * @param originlon 起点经度
//     * @param destinationlat 终点
//     * @param mode 出行方式 导航模式,固定为transit(公交)、 driving(驾车)、walking(步行)和riding(骑行). 默认:driving
//     * 具体看百度地图开放者平台官网  http://lbsyun.baidu.com/index.php?title=uri/api/android
//     */
//  /*// 公交路线规划
//  //i1.setData(Uri.parse("baidumap://map/direction?origin=name:对外经贸大学|latlng:39.98871,116.43234&destination=name:西直门&mode=transit&sy=3&index=0&target=1"));
//  // 驾车路线规划
//  i1.setData(Uri.parse("baidumap://map/direction?region=beijing&origin=39.98871,116.43234&destination=name:西直门&mode=driving"));
//  // 步行路线规划
//  i1.setData(Uri.parse("baidumap://map/direction?region=beijing&origin=39.98871,116.43234&destination=40.057406655722,116.2964407172&mode=walking"));
//  startActivity(i1);*/
//    public static void goToBaiduNaviActivity(Context context, double originlat, double originlon,
//                                             double destinationlat, double destinationlon, String mode) {
//        String locationStr = "baidumap://map/direction?origin="
//                + GCJ02ToBD09(originlon, originlat)[1]
//                + ","
//                + GCJ02ToBD09(originlon, originlat)[0]
//                + "&destination="
//                + GCJ02ToBD09(destinationlon, destinationlat)[1]
//                + ","
//                + GCJ02ToBD09(destinationlon, destinationlat)[0]
//                + "&mode="
//                + mode;
//        Intent intent = new Intent("android.intent.action.VIEW",
//                android.net.Uri.parse(/*stringBuffer.toString()*/locationStr));
//        intent.setPackage("com.baidu.BaiduMap");
//        context.startActivity(intent);
//    }
//
//    /**
//     *  file:///E:/someDownCode/IntentMapGuide-master/%E8%85%BE%E8%AE%AF%E5%9C%B0%E5%9B%BE_URI%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3_150417/URI%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3.html
//     * qqmap://map/routeplan?type=drive&from=天坛南门&fromcoord=39.873145,116.413306&to=国家大剧院&tocoord=39.907380,116.388501
//     * coord=39.904956,116.389449    lat<纬度>,lng<经度>
//     * //移动端启动腾讯地图App,并显示从出发点[天坛南门] 到 [目的地坐标(国家大剧院)] 的驾车路线规划
//     * @param context
//     * @param type 路线规划方式参数:公交 bus   驾车 drive    步行 walk
//     * @param from
//     * @param fromLat
//     * @param fromLon
//     * @param to
//     * @param toLat
//     * @param toLon
//     */
//    public static void goToTenCentNaviActivity(Context context, String type, String from,
//                                               double fromLat, double fromLon, String to, double toLat, double toLon) {
//        String locationStr = "qqmap://map/routeplan?type="
//                + type
//                +"&from="
//                + from
//                + "&fromcoord="
//                + fromLat
//                + ","
//                + fromLon
//                + "&to="
//                + to
//                + "&tocoord="
//                + toLat
//                + ","
//                + toLon;
//        System.out.println("tencent-location:" + locationStr);
//        Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse(locationStr));
//        intent.setPackage("com.tencent.map");
//        context.startActivity(intent);
//    }
//

//    /**
//     * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
//     * 即谷歌、高德 转 百度
//     * 腾讯和高德经纬度一样
//     **经纬度转换 http://blog.csdn.net/meegomeego/article/details/39927017
//     * @param gcj_lon
//     * @param gcj_lat
//     * @return Double[lon, lat]
//     *CoordtransformUtil文件坐标转换
//     */
//    private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
//
//    public static Double[] GCJ02ToBD09(Double gcj_lon, Double gcj_lat) {
//        double z =
//                Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI);
//        double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI);
//        Double[] arr = new Double[2];
//        arr[0] = z * Math.cos(theta) + 0.0065;
//        arr[1] = z * Math.sin(theta) + 0.006;
//        return arr;
//    }
    /**
     * 启动高德App进行导航
     * <h3>Version</h3> 1.0
     * <h3>CreateTime</h3> 2016/6/27,13:58
     * <h3>UpdateTime</h3> 2016/6/27,13:58
     * <h3>CreateAuthor</h3>
     * <h3>UpdateAuthor</h3>
     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)
     *
     * @param sourceApplication 必填 第三方调用应用名称。如 amap
     * @param poiname 非必填 POI 名称
     * @param lat 必填 纬度
     * @param lon 必填 经度
     * @param dev 必填 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
     * @param style 必填 导航方式(0 速度快; 1 费用少; 2 路程短; 3 不走高速;4 躲避拥堵;5 不走高速且避免收费;6 不走高速且躲避拥堵;
     * 7 躲避收费和拥堵;8不走高速躲避收费和拥堵))
     */
    /** 高德导航 **/
//    public static void goToGaodeNaviActivity(Context context, String sourceApplication,
//                                             String poiname, String lat, String lon, String dev, String style) {
//        StringBuffer stringBuffer =
//                new StringBuffer("androidamap://navi?sourceApplication=").append(sourceApplication);
//        if (!TextUtils.isEmpty(poiname)) {
//            stringBuffer.append("&poiname=").append(poiname);
//        }
//        stringBuffer.append("&lat=")
//                .append(lat)
//                .append("&lon=")
//                .append(lon)
//                .append("&dev=")
//                .append(dev)
//                .append("&style=")
//                .append(style);
//
//        Intent intent =
//                new Intent("android.intent.action.VIEW", android.net.Uri.parse(stringBuffer.toString()));
//        intent.setPackage("com.autonavi.minimap");
//        context.startActivity(intent);
//    }

//-----------------------下面是导航第二选择方案---------------------------------------------------------------------------------------------------------------//
//    /**
//     * 根据位置直接解析跳转
//     */
//    private void MapduApiShow() {
//        if (isInstallByRead("com.autonavi.minimap")) {//手机安装了百度地图
            //百度地图api调用
            Intent i1 = new Intent();
            // 地址解析
            i1.setData(Uri.parse("baidumap://map/geocoder?src=openApiDemo&address=申迪南路"));
            mActivity.startActivity(i1);
//            //如果不是地址解析而是传入经纬度那么就用下面的方法
//            openBaiduNavi(mActivity,lat,lng);
//        } else {
//            if (isInstallByRead("com.autonavi.minimap")) {//手机安装高德地图,高德需要起点的经纬度而百度不需要
//                Intent intent = new Intent();
//                intent.setData(Uri
//                        .parse("androidamap://route?sourceApplication=appSelfName"
//                               // + "&slat=36.2&slon=116.1&sname=abc"
//                                + "&slat=36.2&slon=116.1&sname="+"起点"
//                                + "&dlat=36.3" + "&dlon=116.2" +//终点坐标
//                                "&dname=" +"终点"
//                                + "&dev=0&m=0&t=1&showType=1"));
//                mActivity.startActivity(intent);
//            }else{
//                Toast.makeText(mActivity,"请安装高德或百度地图客户端",Toast.LENGTH_LONG).show();
//            }
//        }
//    }
//
//
//    public static boolean isInstallByRead(String packageName) {
//        return new File("/data/data/" + packageName).exists();
//    }
//    public void openBaiduNavi(Context context, String lat, String lng) {
//       // i1.setData(Uri.parse("baidumap://map/geocoder?src=openApiDemo&address=申迪南路"));
//        StringBuffer stringBuffer = new StringBuffer("baidumap://map/geocoder?location=")
//                .append(lat).append(",").append(lng).append("&type=TIME");
//        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
//        intent.setPackage("com.baidu.BaiduMap");
//        context.startActivity(intent);
//    }



版权声明:本文为weixin_38501485原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。