关于Android集成高德地图的那些事儿...显示地图

地图 专栏收录该内容
3 篇文章 0 订阅

    记得在2016年的时候, 有个项目需要在地图上添加Marker 并且连点成线记录坐标 和 地理围栏,  当时也是第一次做,确实有点懵, 不过时间久了, 也还挺简单的 ; 最近项目中又用到了地图 , 借此机会 , 重构下之前的逻辑 , 之前用的是高德地图 , 个人感觉还不错 ,比某度好多了, 开始coding前不妨先下载官方的Demo 看下效果 , 参考下集成文档...

   好了, 今天我们一起来完成高德3D地图代码的集成 , 申请AppKey什么的 , 请自己去高德地图开放平台的控制台注册

   现在高德地图集成已经支持了AndroidStudio依赖 , 不要太简单了 , 这里我集成的是3D map、定位、搜索 

dependencies { 
    implementation 'com.amap.api:3dmap:latest.integration'
    implementation 'com.amap.api:search:latest.integration'
    implementation 'com.amap.api:location:latest.integration'
}

   声明权限来一波

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_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_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

清单文件注册高德地图 APPKey在高德地图的控制台注册

<!--定位服务-->
 <service android:name="com.amap.api.location.APSService" />
 <meta-data
         android:name="com.amap.api.v2.apikey"
         android:value="APPkey" />

  开始撸代码 , 先来个界面初始化;

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_layout);
        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        aMap = mapView.getMap();
        aMap.getUiSettings().setScaleControlsEnabled(true);// 标尺开关
        aMap.getUiSettings().setZoomControlsEnabled(false);//缩放按钮
        aMap.moveCamera(CameraUpdateFactory.zoomTo(ZOOM_MAP));
        aMap.setMyLocationEnabled(true);//触发定位
        aMap.setLocationSource(this);//设置定位资源监听(包含激活定位和销毁定位)
        initLocationOption();//初始化定位客户端 
    }

  初始化定位参数: 定位方式分为三种: Hight_Accuracy(高精度)、Battery_Saving(低功耗)、Device_Sensors(仅设备)

private void initLocationOption() {
        AMapLocationClientOption.AMapLocationMode mode;
        if (Utils.isGpsOpen(this)) {
            mode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy;//高精度模式。
            Log.e(TAG, "当前定位模式为 --->>> 高精度模式");
        } else if (Utils.isGpsNetWorkOpen(this)) {
            mode = AMapLocationClientOption.AMapLocationMode.Battery_Saving;//低功耗模式。
            Log.e(TAG, "当前定位模式为 --->>> 低功耗模式");
        } else {
            mode = AMapLocationClientOption.AMapLocationMode.Device_Sensors;//仅限设备模式。
            Log.e(TAG, "当前定位模式为 --->>> 仅限设备模式");
        }
        if (mLocationOption == null) {
            mLocationOption = new AMapLocationClientOption()
                    .setLocationMode(mode)
                    .setNeedAddress(true)//设置是否返回地址信息(默认返回地址信息)
                    .setInterval(2000)//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
                    .setHttpTimeOut(8000)//单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
                    .setLocationCacheEnable(true);//缓存机制默认开启,可以通过以下接口进行关闭。
        } else {
            mLocationOption.setLocationMode(mode);
        }
        if (mLocationClient == null) {
            mLocationClient = new AMapLocationClient(getApplicationContext());//初始化定位
            mLocationClient.setLocationListener(this);//设置定位回调监听
            mLocationClient.setLocationOption(mLocationOption);
        } else {
            mLocationClient.setLocationOption(mLocationOption);
        }
        mLocationClient.startLocation();//启动定位
    }

  激活定位

@Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        initLocationOption();
        mLocationListener = onLocationChangedListener;
    }

  销毁定位 和 实现地图的生命周期管理

    @Override
    public void deactivate() {
        releaseClient();
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (mapView != null) mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mapView != null) mapView.onPause();
        if (mLocationClient != null) mLocationClient.stopLocation();//停止定位后,本地定位    服务并不会被销毁
    }

    private void releaseClient() {
        if (mLocationClient != null) {
            mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁
            mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
            mLocationClient = null;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mapView != null) mapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mapView != null) mapView.onDestroy();
        releaseClient();  
    }

 定位回调,可在onLocationChanged() 拿到当前定位的坐标信息

     @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (aMapLocation != null) {
            LatLng latLng;
            if (aMapLocation.getErrorCode() == 0) {
                this.aMapLocation = aMapLocation;
                if (mLocationClient != null) {
                    mLocationClient.stopLocation();
                }
                mLocationListener.onLocationChanged(aMapLocation);//显示系统定位小蓝点
                latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
            } else {
                latLng = centerLatLng;//定位失败时 默认的地图中心点
                Toast(aMapLocation.getErrorInfo());
                //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
                Log.e("AmapError", "location Error, ErrCode:"
                        + aMapLocation.getErrorCode() + ", errInfo:"
                        + aMapLocation.getErrorInfo());
            }
            aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng));//定位回调后,将地图移动至定位点
        }
    }

 最后送上预览图片

预览图片

  • 2
    点赞
  • 12
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值