android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能

import android.content.Context;
import android.content.Intent;
import android.net.Uri;

import java.util.ArrayList;
import java.util.List;

/**
 * 文件描述 :
 * 唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能
 * 此工具类不能保证一直有效,若不能唤起请到官网查看文档并调整参数
 * 文档地址 :
 * 百度地图 : http://lbsyun.baidu.com/index.php?title=uri/api/android
 * 高德地图 : https://lbs.amap.com/api/amap-mobile/guide/android/route
 * 腾讯地图 : https://lbs.qq.com/uri_v1/guide-mobile-navAndRoute.html
 * 滴滴出行 : http://developer.xiaojukeji.com/doc/sdk/api/app.html
 *
 * 创建人员 : 幽默GUY
 * 创建日期 : 2019/01/20 0025
 * 创建时间 : 10:03
 * 最后修改 :
 */
public class NavigationTool {

    /**
     * 地图类型
     * BAIDU:百度地图,GAODE:高德地图,TECENT:腾讯地图
     */
    public enum Type {
        BAIDU, GAODE, TECENT
    }

    /**
     * 交通方式
     * WALK:步行,RIDE:骑行,BUS:公交,DRIVE:驾车
     */
    public enum Method {
        WALK, RIDE, BUS, DRIVE
    }

    //包名
    public static final String PACKAGE_NAME_BAIDU_MAP = "com.baidu.BaiduMap";
    public static final String PACKAGE_NAME_GAODE_MAP = "com.autonavi.minimap";
    public static final String PACKAGE_NAME_TECENT_MAP = "com.tencent.map";
    public static final String PACKAGE_NAME_DIDI = "com.sdu.didi.psnger";

    //url scheme
    private static final String BAIDU_URL_SCHEME = "baidumap://map/direction";
    private static final String GAODE_URL_SCHEME = "amapuri://route/plan/";
    private static final String TECENT_URL_SCHEME = "qqmap://map/routeplan";
    private static final String DIDI_URL_SCHEME = "OneTravel://dache/sendorder";

    //公司名称
    private static final String COMPANY_NAME = "company";
    //应用名称
    private static final String APP_NAME = "app_name";
    //腾讯地图开发者APP_KEY
    private static final String TECENT_APP_KEY = "你的app key";

    /**
     * 得到已安装的地图软件
     * @param context
     * @return
     */
    public static Type[] getMapSoftwareTypes(Context context) {
        List<Type> list = new ArrayList<>();
        if (AppTool.hasInstalled(context, PACKAGE_NAME_BAIDU_MAP))
            list.add(Type.BAIDU);
        if (AppTool.hasInstalled(context, PACKAGE_NAME_GAODE_MAP))
            list.add(Type.GAODE);
        if (AppTool.hasInstalled(context, PACKAGE_NAME_TECENT_MAP))
            list.add(Type.TECENT);
        return list.toArray(new Type[0]);
    }

    /**
     * 得到已安装的地图软件
     * @param types
     * @return
     */
    public static String[] getMapSoftwareNames(Type[] types) {
        List<String> list = new ArrayList<>();
        for (Type type : types) {
            switch (type) {
                case BAIDU:
                    list.add("百度地图");
                    break;
                case GAODE:
                    list.add("高德地图");
                    break;
                case TECENT:
                    list.add("腾讯地图");
                    break;
                default:
                    break;
            }
        }
        return list.toArray(new String[0]);
    }

    /**
     * 根据类型得到包名
     * @param type
     * @return
     */
    private static String getPackageName(Type type) {
        switch (type) {
            case BAIDU:
                return PACKAGE_NAME_BAIDU_MAP;
            case GAODE:
                return PACKAGE_NAME_GAODE_MAP;
            case TECENT:
                return PACKAGE_NAME_TECENT_MAP;
            default:
                return null;
        }
    }

    /**
     * 唤起路线规划
     * @param context 上下文
     * @param type 地图类型
     * @param method 交通方式
     * @param latitude 目的地纬度
     * @param longitude 目的地终点经度
     * @param name 目的地名称
     */
    public static boolean start(Context context, Type type, Method method, String latitude, String longitude, String name) {
        //判断是否已安装该软件
        if (!AppTool.hasInstalled(context, getPackageName(type)))
            return false;

        switch (type) {
            case BAIDU:
                baidu(context, method, latitude, longitude, name);
                break;
            case GAODE:
                gaode(context, method, latitude, longitude, name);
                break;
            case TECENT:
                tecent(context, method, latitude, longitude, name);
                break;
            default:
                break;
        }

        return true;
    }

    /**
     * 百度地图路线规划
     * @param context
     * @param method
     * @param latitude
     * @param longitude
     * @param name
     */
     public static void baidu(Context context, Method method, String latitude, String longitude, String name) {
        StringBuffer data = new StringBuffer(BAIDU_URL_SCHEME)
                .append("?coord_type=bd09ll&src=")
                .append("andr.")
                .append(COMPANY_NAME)
                .append(".")
                .append(APP_NAME)
                .append("&destination=");
        if (name != null)
            data.append("name:").append(name).append("|");
        data.append("latlng:")
                .append(latitude)
                .append(",")
                .append(longitude)
                .append("&mode=");
        switch (method) {
            case WALK:
                data.append("walking");
                break;
            case RIDE:
                data.append("riding");
                break;
            case BUS:
                data.append("transit");
                break;
            case DRIVE:
                data.append("driving");
                break;
        }
        startActivity(context, data.toString());
    }

    /**
     * 高德地图路线规划
     * @param context
     * @param method
     * @param latitude
     * @param longitude
     * @param name
     */
    public static void gaode(Context context, Method method, String latitude, String longitude, String name) {
        StringBuffer data = new StringBuffer(GAODE_URL_SCHEME)
                .append("?dev=0&sourceApplication=")
                .append(APP_NAME)
                .append("&dname=")
                .append(name)
                .append("&dlat=")
                .append(latitude)
                .append("&dlon=")
                .append(longitude)
                .append("&t=");
        switch (method) {
            case WALK:
                data.append("2");
                break;
            case RIDE:
                data.append("3");
                break;
            case BUS:
                data.append("1");
                break;
            case DRIVE:
                data.append("0");
                break;
        }
        startActivity(context, data.toString());
    }

    /**
     * 腾讯地图路线规划
     * @param context
     * @param method
     * @param latitude
     * @param longitude
     * @param name
     */
    public static void tecent(Context context, Method method, String latitude, String longitude, String name) {
        StringBuffer data = new StringBuffer(TECENT_URL_SCHEME)
                .append("?referer=")
                .append(TECENT_APP_KEY)
                .append("&to=")
                .append(name)
                .append("&tocoord=")
                .append(latitude)
                .append(",")
                .append(longitude)
                .append("&type=");
        switch (method) {
            case WALK:
                data.append("walk");
                break;
            case RIDE:
                data.append("bike");
                break;
            case BUS:
                data.append("bus");
                break;
            case DRIVE:
                data.append("drive");
                break;
        }
        startActivity(context, data.toString());
    }

    /**
     * 唤起滴滴出行
     * @param context
     * @param latitude
     * @param longitude
     */
    public static void didi(Context context, String latitude, String longitude) {
        StringBuffer data = new StringBuffer(DIDI_URL_SCHEME)
                .append("?source=")
                .append(APP_NAME)
                .append("&dlat=")
                .append(latitude)
                .append("&dlon=")
                .append(longitude);
        startActivity(context, data.toString());
    }

    /**
     * 通过url scheme唤起软件
     * @param context
     * @param data
     */
    public static void startActivity(Context context, String data) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setData(Uri.parse(data));
        context.startActivity(intent);
    }
}

AppTool代码:

public class AppTool {

    /**
     * 根据包名判断是否已安装该软件
     * @param context
     * @param packageName
     * @return
     */
    public static boolean hasInstalled(Context context, String packageName) {
        PackageInfo packageInfo;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            packageInfo = null;
        }
        return packageInfo != null;
    }

}
发布了10 篇原创文章 · 获赞 0 · 访问量 4388

猜你喜欢

转载自blog.csdn.net/qq_34786422/article/details/86567151
今日推荐