Android 起调第三方导航,百度地图,高德地图,腾讯地图。起调高德地图导航
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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("®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=" + 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){//獲取packagemanagerfinal 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,沒有FALSEreturn 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" ><translateandroid: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" ><translateandroid: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#f5f5f5"android:orientation="vertical"><LinearLayoutandroid:id="@+id/neibaiduLayout"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:orientation="horizontal"android:visibility="gone"><TextViewandroid: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><LinearLayoutandroid:id="@+id/baiduLayout"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:orientation="horizontal"android:visibility="gone"><TextViewandroid: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><LinearLayoutandroid:id="@+id/gaodeLayout"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:orientation="horizontal"android:visibility="gone"><TextViewandroid: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><LinearLayoutandroid:id="@+id/tencentLayout"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:orientation="horizontal"android:visibility="gone"><TextViewandroid: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><TextViewandroid: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() {@Overridepublic void onClick(View v) {AmapUtil.goToBaiduNaviActivity(MarkerActivity.this, originlat, originlon, deslat, deslon, "driving");dialog.dismiss();}});gaodeLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {AmapUtil.goToGaodeNaviActivity(MarkerActivity.this, "yxbl","", String.valueOf(deslat), String.valueOf(deslon), "0", "0");dialog.dismiss();}});tencentLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View v) {dialog.dismiss();}});dialog.show();}5、調用
?
showMapDialog("起點", string, latitude, longitude, lawd, lojd );//string、起點位置如:體育路5號,latitude起點緯度,longitude起點經度,lawd終點緯度,lojd終點經度
?
起調高德地圖導航:
?
private static final String GAODE_PACKAGE = "com.autonavi.minimap";工具方法:
private void startGaodeNavi(double latitude, double longitude) {Intent intents = new Intent();intents.setData(Uri.parse("androidamap://navi?sourceApplication=softname&lat="+ latitude+ "&lon="+ longitude+ "&dev=0"));startActivity(intents); } private boolean checkApkExist(Context context, String packageName) {if (TextUtils.isEmpty(packageName)) {return false;}try {context.getPackageManager().getApplicationInfo(packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES);return true;} catch (PackageManager.NameNotFoundException e) {return false;} } private void navigate(double longitude, double latitude) {if (checkApkExist(this, GAODE_PACKAGE)) {startGaodeNavi(latitude, longitude);} else {//showOneToast(R.string.qingxiananzhuanggaodeditu);ToastUtil.showToastLong(this, "請安裝高德app,此刻正打開網頁版");Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");intent.setData(Uri.parse("http://uri.amap.com/navigation?"+ "to="+ longitude+ ","+ latitude+ "&mode=car&src=nyx_super"));startActivity(intent);} }?
啟動數據有效
navigate(109.650222,23.05315);總結
以上是生活随笔為你收集整理的Android 起调第三方导航,百度地图,高德地图,腾讯地图。起调高德地图导航的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 极域电子教室创建和登录教师端的方法
 - 下一篇: iPhone iPad游戏应用开发视频教