第三方:高德地图 蓝点,定位,路线规划

第一步:

如何申请 Key

1、创建新应用

进入控制台,创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。

2、添加新Key

在DOS命令窗口输入下面命令即可

C:\Users\WIN7\.android>keytool -list -v -keystore debug.keystore
输入密钥库口令:

扫描二维码关注公众号,回复: 2259186 查看本文章

*****************  WARNING WARNING WARNING  *****************
* 存储在您的密钥库中的信息的完整性  *
* 尚未经过验证!  为了验证其完整性, *
* 必须提供密钥库口令。                  *
*****************  WARNING WARNING WARNING  *****************

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: androiddebugkey
创建日期: 2018-4-19
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Android Debug, O=Android, C=US
发布者: CN=Android Debug, O=Android, C=US
序列号: 4b188cff
有效期开始日期: Thu Apr 19 09:23:28 CST 2018, 截止日期: Sat Apr 11 09:23:28 CST 2048
证书指纹:
         MD5: 4C:B5:90:BB:91:7F:8A:4A:59:75:2F:7D:DD:03:11:C3

         此SHA1值需要在自己电脑上按步骤申请(下面SHA1值无效)自己获取
         SHA1: AA:02:51:92:DE:DA:E7:C4:95:0B:53:D2:90:3F:56:D1:E3:B0:63:EF;FF
         SHA256: 97:D2:46:AD:57:7F:47:FC:55:12:F8:35:B1:8A:30:06:57:14:F5:B4:E2:79:6A:C8:52:0D:16:85:E4:F5:9E:63
         签名算法名称: SHA256withRSA
         版本: 3

第3步 在Android 清单配置文件中AndroidManifest.xml中

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.win7.mysmalltraining01">

获取包名。

在创建的应用上点击"添加新Key"按钮,在弹出的对话框中,依次输入应用名名称,选择绑定的服务为“Android平台SDK”,输入发布版安全码  SHA1、调试版安全码 SHA1、以及 Package,如下图所示:

需要注意的是: 1个KEY只能用于一个应用(多渠道安装包属于多个应用),1个Key在多个应用上使用会出现服务调用失败。

在阅读完高德地图API服务条款后,勾选此选项,点击“提交”,完成 Key 的申请,此时您可以在所创建的应用下面看到刚申请的 Key 了。

第 4 步 把key添加到清单配置文件AndroidManifest.xml中

添加到application和activity并列

 注意:此value值为开发者申请的key,此图片key值无效

<meta-data android:name="com.amap.api.v2.apikey" android:value="860c5b48aa711d3ed495b1002e01ce7e">
    //开发者申请的key
</meta-data>
<service android:name="com.amap.api.location.APSService"></service>

第 5 步 :在清单配置文件AndroidManifest.xml中添加所需权限

 <!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <!--用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!--用于写入缓存数据到扩展存储卡-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <!--用于申请获取蓝牙信息进行室内定位-->
    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

第6步:添加 jar 文件:

将下载的地图 SDK 的 jar包复制到工程(此处截图以官方示例Demo为例子)的 libs 目录下,如果有老版本 jar 包在其中,请删除。如图所示:

别忘记把jar包导入到项目中

第7步 :在app 下build.gradle 添加sourceSets

android {

  sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
}

第8步:把将下载谷歌的地图Demo中的res文件覆盖到项目中的res文件夹注意values文件夹不要覆盖一个一个粘进去

如图所示:

 第9步:把下载谷歌的地图Demo中的overlay文件和util文件2个类添加到项目中

注意:复制下面的4个类 R文件包不要导错 ,不对的导包文件直接删除即可

 

 第10步:在xml布局文件中添加

首先在布局xml文件中添加地图控件:

XML


<com.amap.api.maps.MapView

    android:id="@+id/map"

    android:layout_width="match_parent"

    android:layout_height="match_parent"/>

第11步:在Activity中添加声明周期的方法

在项目中使用地图的时候需要注意,需要合理的管理地图生命周期,这非常的重要。将下列声明周期的方法复制到Acitivity中

Java


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
        mMapView.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState), 
         保存地图当前的状态
        mMapView.onSaveInstanceState(outState);
    }

  第12步: 绘制地图蓝点

public class MainActivity extends AppCompatActivity {

    private MainActivity mContext;
    private MapView mMapView;
    private AMap aMap;
    private TextView start;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        mContext = MainActivity.this;
        mMapView.onCreate(savedInstanceState);
        // 此方法须覆写,虚拟机需要在很多情况下保存地图绘制的当前状态。
        //初始化地图控制器对象
        if (aMap == null) {
            aMap = mMapView.getMap();
        }
        MyLocationStyle myLocationStyle;
        myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
        myLocationStyle.showMyLocation(true);
        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
        aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。
        aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        getPositioning();
    }
}

实现效果如图所示:

 第13步 :定位当前位置:

public class MainActivity extends AppCompatActivity {
    private MainActivity mContext;
    private MapView mMapView;
    private AMap aMap;
    private TextView start;
 
    public AMapLocationClient mLocationClient = null;
    //声明定位回调监听器
    public AMapLocationListener mLocationListener = new MyAMapLocationListener();
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;
    //  定位当前位置的方法 在哪个需要在哪调用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();
        mContext = MainActivity.this;
        mMapView.onCreate(savedInstanceState);
        // 此方法须覆写,虚拟机需要在很多情况下保存地图绘制的当前状态。
        //初始化地图控制器对象
        if (aMap == null) {
            aMap = mMapView.getMap();
        }
        //定位当前位置的方法哪里需要在哪里调用
        getPositioning();
    }
    public void getPositioning() {
        //初始化定位
        mLocationClient = new AMapLocationClient(this);
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //获取一次定位结果:
        //该方法默认为false。
        mLocationOption.setOnceLocation(true);
        //获取最近3s内精度最高的一次定位结果:
        //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
        mLocationOption.setOnceLocationLatest(true);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        //设置是否允许模拟位置,默认为true,允许模拟位置
        mLocationOption.setMockEnable(true);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //启动定位
        mLocationClient.startLocation();
    }
 
    class MyAMapLocationListener implements AMapLocationListener {
        @Override
        public void onLocationChanged(final AMapLocation aMapLocation) {
            double latitude = aMapLocation.getLatitude();//获取纬度
            double longitude = aMapLocation.getLongitude();//获取经度
            String aoiName = aMapLocation.getAoiName();
            String aoiName2 = aMapLocation.getPoiName();获取当前所在地址
            String address = aMapLocation.getCity();获取的当前所在城市
            start.setText(address);//设置当前城市的位置到UI
        }
    }
    private void initView() {
        mMapView = (MapView) findViewById(R.id.mapView);
        start = (TextView) findViewById(R.id.start);
 
    }
}

第14步:路线规划

首先设置起点位置→然后设置终点位置→最后规划路线;

我把这3个步骤写成方法了 调用的时候注意就可以了

首先设置起点:起点方法

//设置起点的方法

private GeocodeSearch geocoderSearch;
private LatLonPoint latLonPoint;

private void qidian() {
        geocoderSearch = new GeocodeSearch(this);
        geocoderSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {

            }

            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
                latLonPoint = geocodeResult.getGeocodeAddressList().get(0).getLatLonPoint();
                zhongdian();
            }

        });
        //起点默认设置为鹤壁 也可以自己定义位置
        GeocodeQuery query = new GeocodeQuery("鹤壁", "");
        geocoderSearch.getFromLocationNameAsyn(query);
    }

  其次:终点的方法:

 设置终点的方法
 private LatLonPoint latLonPoint1; 
 private void zhongdian() {
        geocoderSearch = new GeocodeSearch(this);
        geocoderSearch.setOnGeocodeSearchListener(new 
        GeocodeSearch.OnGeocodeSearchListener() {
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {

            }

            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
                latLonPoint1 = 
        geocodeResult.getGeocodeAddressList().get(0).getLatLonPoint();
              调用路线规划
                luxian();
            }
        });
        GeocodeQuery query = new GeocodeQuery("河北", "");
        geocoderSearch.getFromLocationNameAsyn(query);
    }

 最后:路线规划的方法

 private RouteSearch routeSearch;
 // 路线规划的方法
 private void luxian() {
        routeSearch = new RouteSearch(this);
        routeSearch.setRouteSearchListener(new RouteSearch.OnRouteSearchListener() {
            @Override
            public void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
            }

            @Override
            public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
                aMap.clear();
                if (errorCode == AMapException.CODE_AMAP_SUCCESS) {
                    if (result != null && result.getPaths() != null) {
                        if (result.getPaths().size() > 0) {
                            final DrivePath drivePath = result.getPaths()
                                    .get(0);
                            if (drivePath == null) {
                                return;
                            }
               DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
                                    mContext, aMap, drivePath,
                                    result.getStartPos(),
                                    result.getTargetPos(), null);
                            drivingRouteOverlay.setNodeIconVisibility(false);
                            drivingRouteOverlay.setIsColorfulline(true);
                            drivingRouteOverlay.removeFromMap();
                            drivingRouteOverlay.addToMap();
                            drivingRouteOverlay.zoomToSpan();
                        } else if (result != null && result.getPaths() == null) {
                            ToastUtil.show(mContext, R.string.no_result);
                        }

                    } else {
                        ToastUtil.show(mContext, R.string.no_result);
                    }
                } else {
                    ToastUtil.showerror(MainActivity.this, errorCode);
                }
            }

            @Override
            public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {
            }

            @Override
            public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {

            }
        });
        RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(latLonPoint, latLonPoint1);
        RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, 0, null, null, "");
        routeSearch.calculateDriveRouteAsyn(query);
    }

  效果图如图所示:

通过以上配置就算完成了 高德地图的 蓝点, 定位 , 和 路线规划!

如有问题 请和我留言

猜你喜欢

转载自blog.csdn.net/weixin_42429629/article/details/81104969