美文网首页
android调起第三方地图app的uri

android调起第三方地图app的uri

作者: yunhen | 来源:发表于2020-06-16 23:00 被阅读0次
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;



import java.util.List;

/**
 * Created by wanghh on 2017/11/10.
 */

public class ThirdNavigationUtil {
    public static final String amapPkg = "com.autonavi.minimap";
    public static final String baiduMapPkg = "com.baidu.BaiduMap";
    public static final String amapCheJiPkg = "com.autonavi.amapauto";
    public static final String tencentMapPkg = "com.tencent.map";
    public static final String sogouMapPkg = "com.sogou.map.android.maps";
    /**
     * 启动第三方地图app,并开始导航(第三方地图)
     * @param context
     * @param lat
     * @param lon
     * @param destinationTitle
     * @param type             ConstUtil.MapAppType.AMAP_APP
     */
    public static void openThirdAppNavigation(final Context context, final String lat,
                                              final String lon, final String destinationTitle,
                                              int type) {
        L.d("openThirdAppNavigation","type = "+type);
        VoiceRobot.getInstance(context).stopSpeakRecordStartAwake();
        //网页高德
//                getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://uri.amap.com/navigation?from=116.478346,39.997361,startpoint&to=116.3246,39.966577,endpoint&via=116.402796,39.936915,midwaypoint&mode=car&policy=1&src=mypage&coordinate=gaode&callnative=0")));
        final PackageManager packageManager = context.getPackageManager();
        if (type == ConstUtil.MapAppType.AMAP_APP) {
            //高德地图app
            Intent amapIntent = new Intent(Intent.ACTION_VIEW,
                    android.net.Uri.parse("androidamap://navi?sourceApplication="
                            + context.getString(R.string.app_name) + "&poiname="
                            + destinationTitle + "&lat=" + lat + "&lon=" + lon + "&dev=0&style=2"));
            amapIntent.setPackage(amapPkg);
            startAct(context,amapPkg,packageManager,amapIntent,type);
//            List<ResolveInfo> activities = packageManager.queryIntentActivities(amapIntent, 0);
//            boolean isValid = !activities.isEmpty();
//            if (isValid) {
//                ConstUtil.isNeedXunHangBroadCast = false;
//                FucUtil.addToRecentIntentsByPackageName(context.getApplicationContext(), amapPkg);
//                context.startActivity(amapIntent);
//            } else {
//                MyToastUtils.show(context, "请先下载安装高德地图!");
//                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_AMAP_URL)));
//            }
        } else if (type == ConstUtil.MapAppType.BDMAP_APP) {
            //百度地图app
            double[] gaodeToBaiduPoint = gaoDeToBaidu(Double.parseDouble(lat), Double.parseDouble(lon));
            Intent baiduIntent = new Intent(Intent.ACTION_VIEW);
//            baiduIntent.setData(Uri.parse("baidumap://map/navi?query=" + destinationTitle));//
//            DecimalFormat df = new DecimalFormat("0.0000");
//            baiduIntent.setData(Uri.parse("baidumap://map/navi?location=" + df.format(GaodeToBaiduPoint[0]) + "," + df.format(GaodeToBaiduPoint[1])));
            baiduIntent.setData(Uri.parse("baidumap://map/navi?location=" + gaodeToBaiduPoint[0] + "," + gaodeToBaiduPoint[1]));
            startAct(context,baiduMapPkg,packageManager,baiduIntent,type);
//            List<ResolveInfo> activities = packageManager.queryIntentActivities(baiduIntent, 0);
//            boolean isValid = !activities.isEmpty();
//            if (isValid) {
//                ConstUtil.isNeedXunHangBroadCast = false;
//                FucUtil.addToRecentIntentsByPackageName(context.getApplicationContext(), baiduMapPkg);
//                context.startActivity(baiduIntent);
//            } else {
//                MyToastUtils.show(context, "请先下载安装百度地图!");
//                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_BAIDU_URL)));
//            }
        } else if (type == ConstUtil.MapAppType.AMAP_AUTO) {
            //高德地图车机版 oppo手机不支持
            //高德地图车机版本 使用该包名

            Intent launchIntent = new Intent();
            launchIntent.setComponent(
                    new ComponentName(amapCheJiPkg,
                            "com.autonavi.auto.remote.fill.UsbFillActivity"));
            startAct(context,amapCheJiPkg,packageManager,launchIntent,type);
//            List<ResolveInfo> activities = packageManager.queryIntentActivities(launchIntent, 0);
//            boolean isValid = !activities.isEmpty();
//            if (isValid) {
//                ConstUtil.isNeedXunHangBroadCast = false;
//                FucUtil.addToRecentIntentsByPackageName(context.getApplicationContext(), amapCheJiePkg);
//                context.startActivity(launchIntent);
//            } else {
//                MyToastUtils.show(context, "请先下载安装高德地图车机版!");
//                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_AMAP_AUTO_URL)));
//            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Intent intent = new Intent();
                    //这里用显示 intent,因为车机版是注册的静态广播
                    ComponentName cn = new ComponentName(amapCheJiPkg
                            ,"com.autonavi.amapauto.adapter.internal.AmapAutoBroadcastReceiver");
                    intent.setComponent(cn);

                    intent.setAction("AUTONAVI_STANDARD_BROADCAST_RECV");
                    /**
                     * 10038 这个可以直接发起导航,不用规划
                     */
                    intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
                    intent.putExtra("KEY_TYPE", 10038);
                    intent.putExtra("POINAME", destinationTitle);
                    intent.putExtra("LAT", Double.parseDouble(lat));
                    intent.putExtra("LON", Double.parseDouble(lon));
                    intent.putExtra("DEV", 0);
                    intent.putExtra("STYLE", 0);
                    intent.putExtra("SOURCE_APP", context.getString(R.string.app_name));


                    /**
                     * https://lbs.amap.com/api/amap-auto/guide/android/navi
                     * 这个10007 是先规划,在开始导航
                     */
//                    intent.putExtra("KEY_TYPE", 10007);
//                    intent.putExtra("EXTRA_DNAM", destinationTitle);
//                    intent.putExtra("ENTRY_LAT", Double.parseDouble(lat));
//                    intent.putExtra("ENTRY_LON", Double.parseDouble(lon));
//                    intent.putExtra("EXTRA_DEV", 0);
//                    intent.putExtra("EXTRA_M", -1);

                    context.sendBroadcast(intent);
//                    MyToastUtils.showDebug("给高德车机发送终点");
                    L.d("openThirdAppNavigation","给高德车机发送终点 ");
                }
            }).start();

        } else if (type == ConstUtil.MapAppType.TXMAP_APP) {
            //腾讯地图
            /**
             * * @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  必  调用来源,一般为您的应用名称,为了保障对您的服务,请务必填写!
            ---------------------
            官方文档地址:https://lbs.qq.com/uri_v1/guide-mobile-navAndRoute.html
            原文:https://blog.csdn.net/lu1024188315/article/details/78496455?utm_source=copy
             */
            String url1 = "qqmap://map/routeplan?fromcoord=CurrentLocation&type=drive&to=" + destinationTitle + "&tocoord=" + lat+ "," +
                    lon  + "&policy=2&referer=yunjiaHUD";
            Intent qqMapIntent = new Intent(Intent.ACTION_VIEW, android.net.Uri.parse(url1));
//            qqMapIntent.setPackage(tencentMapPkg);
//            qqMapIntent.setData(android.net.Uri.parse(url1));
            startAct(context,tencentMapPkg,packageManager,qqMapIntent,type);
            //谷歌地图app
//            Intent googleIntent = new Intent(Intent.ACTION_VIEW);
//            googleIntent.setData(Uri.parse("google.navigation:q=" + Double.parseDouble(lat) + "," + Double.parseDouble(lon)));
//            googleIntent.setPackage("com.google.android.apps.maps");
////            if (googleIntent.resolveActivity(context.getPackageManager()) != null) {
////                context.startActivity(googleIntent);
////            }
//            List<ResolveInfo> activities = packageManager.queryIntentActivities(googleIntent, 0);
//            boolean isValid = !activities.isEmpty();
//            if (isValid) {
//                ConstUtil.isNeedXunHangBroadCast = false;
//                FucUtil.addToRecentIntentsByPackageName(context.getApplicationContext(), "com.google.android.apps.maps");
//                context.startActivity(googleIntent);
//            } else {
//                MyToastUtils.show(context, "请先下载安装谷歌地图!");
//            }
        }else if (type == ConstUtil.MapAppType.SOUGOU_APP){
            //搜狗地图app

            String sgStr = "geo:"+lat+","+lon;
            Intent sogouIntent = new Intent(Intent.ACTION_VIEW,
                    android.net.Uri.parse(sgStr));
            sogouIntent.setPackage(sogouMapPkg);
            startAct(context,sogouMapPkg,packageManager,sogouIntent,type);
        }
    }

    private static double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
        double[] bd_lat_lon = new double[2];
        double PI = 3.14159265358979324 * 3000.0 / 180.0;
        double x = gd_lon, y = gd_lat;
        double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
        double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
        bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
        bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
        return bd_lat_lon;
    }


    private static double[] bdToGaoDe(double bd_lat, double bd_lon) {
        double[] gd_lat_lon = new double[2];
        double PI = 3.14159265358979324 * 3000.0 / 180.0;
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
        gd_lat_lon[0] = z * Math.cos(theta);
        gd_lat_lon[1] = z * Math.sin(theta);
        return gd_lat_lon;
    }


    /**
     * 保存intent到ConstUtil.mAppRecentIntents,启动第三方app
     * @param context
     * @param pkgName
     * @param packageManager
     * @param mapIntent
     * @param type
     */
    private static void startAct(Context context,String pkgName,PackageManager packageManager
        ,Intent mapIntent,int type) {
//        amapIntent.setPackage(pkgName);
        List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
        boolean isValid = !activities.isEmpty();
        if (isValid) {
            ConstUtil.isNeedXunHangBroadCast = false;
            FucUtil.addToRecentIntentsByPackageName(context.getApplicationContext(), pkgName);
            context.startActivity(mapIntent);
        } else {
            if (type == 1) {
                MyToastUtils.show( "请先下载安装高德地图!");
                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_AMAP_URL)));
            } else if (type == 2){
                MyToastUtils.show( "请先下载安装百度地图!");
                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_BAIDU_URL)));
            } else if (type == 3) {
                MyToastUtils.show( "请先下载安装高德地图车机版!");
                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_AMAP_AUTO_URL)));
            } else if (type == 4) {
                MyToastUtils.show( "请先下载安装腾讯地图!");
                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ConstUtil.DOWNLOAD_TENMAP_URL)));
            }

        }
    }
}

相关文章

网友评论

      本文标题:android调起第三方地图app的uri

      本文链接:https://www.haomeiwen.com/subject/yovdxktx.html