Android 起调第三方导航,百度地图,高德地图,腾讯地图

主要工具类

/**
 * Created by meixi on 2018/6/29.
 * 使用第三方导航:高德、百度。。。。。。。。。。
 */
public class AmapUtil {
    public static final String BAIDU = "com.baidu.BaiduMap";
    public static final String GAODE = "com.autonavi.minimap";
    public static final String TENCENT = "com.tencent.map";
    /**
     * 启动高德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(GAODE);
        context.startActivity(intent);
    }

    /**
     * @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 static void goToGaodeNaviActivity(Context context, String sourceApplication, String slat,
                                             String slon, 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="
                + slon
                +
                "&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(/*stringBuffer.toString()*/locationStr));
        intent.setPackage(GAODE);
        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=" + BAIDU +";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(BAIDU);
        context.startActivity(intent);
    }


    /** 腾讯地图 Uri 标识*/
    public  final static  String BASE_URL = "qqmap://map/";
    /**
     * 调用腾讯地图app驾车导航
     * (此处输入方法执行任务.)
     * <h3>Version</h3> 1.0
     * <h3>CreateTime</h3> 2017/11/9,15:31
     * <h3>UpdateTime</h3> 2017/11/9,15:31
     * <h3>CreateAuthor</h3>
     * <h3>UpdateAuthor</h3>
     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)
     * @param context
     * @param from  选 出发地址
     * @param fromcoord 选 出发经纬度   移动端如果起点名称和起点坐标均未传递,则使用当前定位位置作为起点 如 39.9761,116.3282
     * @param to  必 目标地址
     * @param tocoord  必 目标经纬度 39.9761,116.3282
     * @param policy  选  本参数取决于type参数的取值
     *               公交:type=bus,policy有以下取值 0:较快捷 1:少换乘 2:少步行 3:不坐地铁
     *               驾车:type=drive,policy有以下取值 0:较快捷 1:无高速 2:距离 policy的取值缺省为0
     * @param coord_type  选 坐标类型,取值如下:1 GPS  2 腾讯坐标(默认)  如果用户指定该参数为非腾讯地图坐标系,则URI API自动进行坐标处理,以便准确对应到腾讯地图底图上。
     * @param type  必 公交:bus  驾车:drive  步行:walk(仅适用移动端)
     * @param referer  必  调用来源,一般为您的应用名称,为了保障对您的服务,请务必填写!
     */
    public static  void invokeNavi(Context context, @NonNull String type, String coord_type, String from ,
                                   String fromcoord, @NonNull String to, @NonNull String tocoord, String policy, @NonNull String referer){
        StringBuffer stringBuffer  = new StringBuffer(BASE_URL)
                .append("routeplan?")
                .append("type=")
                .append(type)
                .append("&to=")
                .append(to)
                .append("&tocoord=")
                .append(tocoord)
                .append("&referer=")
                .append(referer);
        if (!TextUtils.isEmpty(from)){
            stringBuffer.append("&from=").append(from);
        }
        if (!TextUtils.isEmpty(fromcoord)){
            stringBuffer.append("&fromcoord=").append(fromcoord);
        }
        if (!TextUtils.isEmpty(policy)){
            stringBuffer .append("&policy=").append(policy);
        }
        if (!TextUtils.isEmpty(coord_type)){
            stringBuffer .append("&coord_type=").append(coord_type);
        }
        Intent intent = new Intent();
        intent.setData(Uri.parse(stringBuffer.toString()));
        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(TENCENT);
        context.startActivity(intent);
    }

    /**
     * 根据包名检测某个APP是否安装
     * <h3>Version</h3> 1.0
     * <h3>CreateTime</h3> 2016/6/27,13:02
     * <h3>UpdateTime</h3> 2016/6/27,13:02
     * <h3>CreateAuthor</h3>
     * <h3>UpdateAuthor</h3>
     * <h3>UpdateInfo</h3> (此处输入修改内容,若无修改可不写.)
     *
     * @param packageName 包名  百度的包名为 com.baidu.BaiduMap,高德com.autonavi.minimap,腾讯
     * @return true 安装 false 没有安装
     */
    public static boolean isInstallByRead(String packageName) {
        return new File("/data/data/" + packageName).exists();
    }

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

    /**
     * 火星坐标系 (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;
    }
    /**
     * 调用高德导航
     */
  /*public void aMap(View view){
    if (AMapUtil.isInstallByRead("com.autonavi.minimap")){
      AMapUtil.goToNaviActivity(this,"test",null,"34.264642646862","108.95108518068","1","2");
    }
  }*/
}


1、两个动画

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="200"
        android:fromYDelta="50%p"
        android:toYDelta="0" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="50%p" />
</set>

2、style

<style name="AnimViewshow" parent="@android:style/Theme">
    <item name="android:windowEnterAnimation">@animator/push_bottom_in</item>
    <item name="android:windowExitAnimation">@animator/push_bottom_out</item>
</style>

3、dialoglayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:background="#FFFFFF"
              android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f5f5f5"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/neibaiduLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:orientation="horizontal"
            android:visibility="gone">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="8dp"
                android:gravity="center"
                android:text="内置导航"
                android:textColor="#0b7cd4"
                android:textSize="15dp" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/baiduLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:orientation="horizontal"
            android:visibility="gone">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="8dp"
                android:gravity="center"
                android:text="百度地图"
                android:textColor="#0b7cd4"
                android:textSize="15dp" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/gaodeLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:orientation="horizontal"
            android:visibility="gone">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="8dp"
                android:gravity="center"
                android:text="高德地图"
                android:textColor="#0b7cd4"
                android:textSize="15dp" />


        </LinearLayout>

        <LinearLayout
            android:id="@+id/tencentLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:orientation="horizontal"
            android:visibility="gone">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="8dp"
                android:gravity="center"
                android:text="腾讯地图"
                android:textColor="#0b7cd4"
                android:textSize="15dp" />


        </LinearLayout>
    </LinearLayout>

    <TextView
        android:id="@+id/dismiss"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:gravity="center"
        android:textSize="15dp"
        android:textColor="#343434"
        android:text="取 消"/>

</LinearLayout>

4、showDialog

 /**
     *hxw
     * 弹框显示导航地图
     *
     * */
    public void showMapDialog(final String startName, final String endName, final double originlat, final double originlon, final double deslat, final double deslon) {
        final Dialog dialog;
        LayoutInflater inflater = LayoutInflater.from(MarkerActivity.this);
        View view = inflater.inflate(R.layout.navigation_dialog, null);
        LinearLayout baiduLayout = (LinearLayout) view.findViewById(R.id.baiduLayout);
        LinearLayout gaodeLayout = (LinearLayout) view.findViewById(R.id.gaodeLayout);
        LinearLayout tencentLayout = (LinearLayout) view.findViewById(R.id.tencentLayout);
        TextView dismiss = (TextView)view.findViewById(R.id.dismiss);
        dialog = new Dialog(MarkerActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(view);
        Window dialogWindow = dialog.getWindow();
        dialogWindow.setGravity(Gravity.BOTTOM);
        dialogWindow.setWindowAnimations(R.style.AnimViewshow);

//    dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
//        dialogWindow.setGravity(Gravity.CENTER);

//        lp.width = 900; // 宽度
//        lp.height = 650; // 高度
//        lp.alpha = 0.7f; // 透明度

        dialogWindow.setAttributes(lp);

        dialog.setCanceledOnTouchOutside(true);
        List<String> installedMapList = AmapUtil.isAvilibleList(MarkerActivity.this);
        if (installedMapList.size() == 0) {
            Toast.makeText(MarkerActivity.this, "请安装导航地图软件", Toast.LENGTH_LONG).show();
            return;
        }
        for (String map :installedMapList) {
            if (map.equals(AmapUtil.BAIDU)) {
                baiduLayout.setVisibility(View.VISIBLE);
            }else if (map.equals(AmapUtil.GAODE)) {
                gaodeLayout.setVisibility(View.VISIBLE);
            } else if (map.equals(AmapUtil.TENCENT)) {
                tencentLayout.setVisibility(View.VISIBLE);
            }
        }

        StringBuilder sb = new StringBuilder();

        baiduLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AmapUtil.goToBaiduNaviActivity(MarkerActivity.this, originlat, originlon, deslat, deslon, "driving");
                dialog.dismiss();
            }
        });
        gaodeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AmapUtil.goToGaodeNaviActivity(MarkerActivity.this, "yxbl","", String.valueOf(deslat), String.valueOf(deslon), "0", "0");
                dialog.dismiss();
            }
        });
        tencentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
//                AmapUtil.goToTenCentNaviActivity(getContext(), "drive", startName, originlat, originlon, endName, deslat, deslon);
                String toc = String.valueOf(deslat)+","+String.valueOf(deslon);
//                AmapUtil.invokeNavi(mContext,"drive",null,null,null,"故宫","39.9761,116.3282",null,"textApp");
                AmapUtil.invokeNavi(mContext,"drive",null,null,null,endName,toc,null,"textApp");
                dialog.dismiss();
            }
        });
        dismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }

5、调用

showMapDialog("起点", string, latitude, longitude, lawd, lojd );
//string、起点位置如:体育路5号,latitude起点纬度,longitude起点经度,lawd终点纬度,lojd终点经度

猜你喜欢

转载自blog.csdn.net/meixi_android/article/details/80675455