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("®ion=").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 版权协议,转载请附上原文出处链接和本声明。