从零开始的Android Studio + 高德地图SDK实现地图定位 + 导航

一、获取高德KEY

首先进入高德控制台,在我的应用中点击"添加key",如下图所示:

其中需要填写的发布版SHA1、调试版SHA1和PackageName获取方式如下:

1.发布版SHA1:

首先需要创建自己项目的发布版SHA1:在Android Studio中build下面点击“Generate Signed Bundle or APK, 选择APK,点击next:

选择Creat new...来创建key,选择好存放目录,并设置密码。next后选择release,点击Finish完成创建

然后找到自己电脑的jdk安装目录,进入./bin文件夹,其中会有keytool.exe,在./bin文件夹中右键鼠标,点击在终端中打开,输入下面“bin>”后面的代码:

E:\java\bin> ./keytool.exe -list -v -keystore D:\自己的key保存目录\自己的key命名.jks

然后输入前面设置的密码,成功获得发布版SHA1。

2.调试版SHA1:

 首先找到自己的debug.keystore位置,一般在C盘下的用户目录内:C:\Users\自己的用户名\.android\debug.keystore。

再找到自己电脑的jdk安装目录,进入./bin文件夹,其中会有keytool.exe,在./bin文件夹中右键鼠标,点击在终端中打开,输入下面“bin>”后面的代码:

E:\java\bin> .\keytool.exe -list -v -keystore C:\Users\自己的用户名\.android\debug.keystore

然后输入密码,默认密码为:android,成功获得调试版SHA1。

3.PackageName:

这个在自己的项目中的AndroidManifest.xml获取: package = "所需要的PackageName"

完成上述三步后就得到了高德地图的KEY

二、相关变量定义(随着更新丰富)

在java文件目录的实现类Activity中粘贴

    private MapView mMapView = null;
    private AMap aMap = null;
    private LatLng latLng_me = null;
    private boolean firstOpen = true;

三、创建地图

 1.应用高德KEY

在AndroidManifest.xml中<application>标签里面粘贴:

<meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="获取的高德KEY"/>

2.申请权限

在AndroidManifest.xml中<application>标签外面粘贴:(方便起见我把后面会用到的所有权限全部给出)

    <!--允许访问网络,必选权限-->
    <uses-permission android:name="android.permission.INTERNET" />

    <!--允许获取粗略位置,若用GPS实现定位小蓝点功能则必选-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!--允许获取网络状态,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!--允许获取wifi网络信息,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!--允许获取wifi状态改变,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

    <!--允许写入扩展存储,用于数据缓存,若无此权限则写到私有目录-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!--允许读设备等信息,用于问题排查-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

    <!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

    <!--用与导航状态中保持屏幕常亮-->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

3.创建地图layout

在布局文件activity_layout.xml中粘贴:

<com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

4.实现地图生命周期

在实现类Activity中粘贴

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        //隐私合规接口
        MapsInitializer.updatePrivacyShow(getApplicationContext(), true, true);
        MapsInitializer.updatePrivacyAgree(getApplicationContext(), true);
        //基础库设置允许采集个人及设备信息
        AMapUtilCoreApi.setCollectInfoEnable(true);

        //创建地图
        mMapView = (MapView) findViewById(R.id.map);
        mMapView.onCreate(savedInstanceState);

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);
    }

然后运行即可完成创建地图。

四、实现定位

1.动态权限申请(android系统太安全了)

对于现在版本的android,我们需要在实现类Activity中实现启动app时再次申请所需要的权限,在进行定位之前位置粘贴:

        //检查权限是否允许(动态申请权限)
        List<String> permissionList = new ArrayList<>();
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.INTERNET);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_NETWORK_STATE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_WIFI_STATE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.CHANGE_WIFI_STATE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.WAKE_LOCK);
        }
        if (!permissionList.isEmpty()) {
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(MapActivity_fast.this, permissions, 1);
        }

2.进行定位 

   //初始化地图控制器对象
   aMap = mMapView.getMap();
   aMap.setTrafficEnabled(true);// 显示实时交通状况
   aMap.getUiSettings().setZoomControlsEnabled(false);//设置地图缩放按钮不显示
   aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//设置初始缩放大小
   //实现定位监听器
   aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {
           //这里返回定位的经纬度
           latLng_me = new LatLng(location.getLatitude(), location.getLongitude());
           //这里在第一次打开时将地图位置自动定位到自己所在处
           if(firstOpen) {
              aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng_me));
              firstOpen = false;
           }
        }
   });

   //初始化定位蓝点样式类
   MyLocationStyle myLocationStyle = new MyLocationStyle();
   //连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
   myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
   //设置连续定位模式下的定位间隔,只在连续定位模式下生效, 单次定位模式下不会生效。单位为毫秒。
   myLocationStyle.interval(3000); 
   aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
   aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮显示
   aMap.setMyLocationEnabled(true);// 设置启动显示定位蓝点

然后运行即可实现定位。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值