高德地图在Android中的使用

本文详细介绍如何在Android应用中集成高德地图定位服务,包括必要的权限配置、Gradle集成步骤及具体代码实现。通过本教程,开发者可以快速掌握利用高德地图API实现设备定位的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高德地图在Android中的使用-定位

  • 配置
  • 代码解析
  • 效果展示
  • 参考内容

配置

AMap_Location–>高德定位服务包
AMap_Search–>高德搜索服务包
AMap_Map3D–>高德3D地图服务包,注意3D地图需要添加so库,实现对不同CPU架构的支持

MVP架构

接下来进行项目的配置,通过Gradle集成SDK,修改AndroidManifest.xml文件配置权限和KEY。

<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
android.permission.ACCESS_NETWORK_STATE
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
android.permission.ACCESS_WIFI_STATE
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_CONFIGURATION
<!-- 请求网络 -->
android.permission.INTERNET
<!-- 后台唤醒定位需要的权限 -->
android.permission.WAKE_LOCK
<!--用于进行网络定位-->
android.permission.ACCESS_COARSE_LOCATION
<!--用于访问GPS定位-->
android.permission.ACCESS_FINE_LOCATION
<!--用于提高GPS定位速度-->
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
android.permission.WRITE_EXTERNAL_STORAGE
<!--读取缓存数据-->
android.permission.READ_EXTERNAL_STORAGE
<!--用于读取手机当前的状态-->
android.permission.READ_PHONE_STATE
 <!-- 设置key -->
<meta-data android:name="com.amap.api.v2.apikey"
           android:value="48294465fd80782208814b2138a3a8b4" />
<!-- 定位需要的服务 -->
<service android:name="com.amap.api.location.APSService" >
</service>

代码解析

  • Layout布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

        <TextView
        android:id="@+id/info_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    </FrameLayout>

</LinearLayout>
  • LocListener-监听器
    LocListener接口由Activity继承,实现应用对位置变化的逻辑处理
/**
 * Created by JiachenWang on 2017/4/3.
 */

public interface LocListener {

    /**
     * 位置信息改变,设备移动
     *
     * @param amapLocation 改变的位置信息
     */
    void onLocationMove(AMapLocation amapLocation);
}
  • Activity-onLocationMove方法
    每当检测到位置的移动,检查数据的有效性并进行地图的绘制
       @Override
    public void onLocationMove(AMapLocation amapLocation) {
        if (runningLocController != null && amapLocation != null) {
            if (amapLocation != null && amapLocation.getErrorCode() == 0) {
                LatLng mylocation = LocationUtils.formatLatLng(amapLocation);
                aMap.moveCamera(CameraUpdateFactory.changeLatLng(mylocation));
                record.addpoint(amapLocation);
                mPolyoptions.add(mylocation);
                mTracelocationlist.add(TraceUtils.parseTraceLocation(amapLocation));
                redrawline();
                updateLastLoc(mylocation);
                if (mTracelocationlist.size() > tracesize - 1) {
                    trace();
                }
            } else {
                String errText = "定位失败," + amapLocation.getErrorCode() + ": "
                        + amapLocation.getErrorInfo();
                Log.e("AmapErr", errText);
            }
        }
    }
  • LocController-定位控制器
    LocController作为Activity的成员变量用于控制定位服务,包括定位的参数配置以及启用停止
/**
 * Created by JiachenWang on 2017/4/3.
 */

public class LocController {

    private AMapLocationClient locationClient = null;
    private AMapLocationClientOption locationOption = new AMapLocationClientOption();

    private Context context;
    private LocListener locListener;

    public LocController(@NonNull Context context, @NonNull LocListener locListener) {
        this.context = context;
        this.locListener = locListener;
        //初始化定位
        if (context != null) {
            initLocation();
        }

    }

    /**
     * 初始化定位
     */
    private void initLocation() {
        //初始化client
        locationClient = new AMapLocationClient(context);
        //设置定位参数
        locationClient.setLocationOption(getDefaultOption());
        // 设置定位监听
        locationClient.setLocationListener(aMaplocationListener);
    }

    /**
     * 定位监听
     */
    AMapLocationListener aMaplocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation loc) {
            locListener.onLocationMove(loc);
        }
    };

    /**
     * 默认的定位参数
     */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
        return mOption;
    }

    /**
     * 开始定位
     */
    public void startLocation() {
        // 设置定位参数
        locationClient.setLocationOption(locationOption);
        // 启动定位
        locationClient.startLocation();
    }

    /**
     * 停止定位
     */
    public void stopLocation() {
        locationClient.stopLocation();
    }

    /**
     * 销毁定位
     */
    public void destroyLocation() {
        if (null != locationClient) {
            locationClient.onDestroy();
            locationClient = null;
            locationOption = null;
        }
    }
}

效果展示

截图1
这里写图片描述

参考内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值