开发 Android 地图SDK 概述

概述 最后更新时间: 2021年11月23日

重要:由于个人信息保护法的实施,从地图8.1.0版本起对旧版本SDK不兼容,请务必确保调用SDK任何接口前先调用更新隐私合规updatePrivacyShow、updatePrivacyAgree两个接口,具体可参考开发指南-其他配置注意事项-隐私合规接口说明传入相关参数。否则可能产生的异常情况如下:

  1. MapView、TextureMapView、MapFragment显示白屏;
  2. OfflineMapManager、OfflineMapActivity、LBSTraceClient、搜索接口也需在初始化时对抛出的异常进行捕获,否则可能导致编译不通过、空指针等异常情况;

Flutter兼容性:Flutter3.0.0版本已发布,兼容Android定位5.6.0、iOS定位2.8.0、地图8.1.0及以上版本,可前往 Flutter插件下载页面 获取对应版本

Android地图SDK简介

高德开放平台目前开放了Android 地图 SDK 以及 Android 地图 SDK 专业版两套地图SDK工具。

高德地图 Android SDK 是一套地图开发调用接口,开发者可以轻松地在自己的Android应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。

高德地图 Android SDK 专业版是在 Android SDK 已有服务的基础上,新增支持了自定义地图在线加载、自定义地图元素纹理等功能,便于开发者完成基于自身场景的更深层、更个性化地图的开发需求。

V4.0.0开始,除了支持手机设备外,还支持Android Wear。

功能介绍与体验

  • 展示地图
    package com.amap.map3d.demo.basic;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    import com.amap.api.maps.AMap;
    import com.amap.api.maps.MapView;
    import com.amap.map3d.demo.R;
    
    public class AmapActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.basicmap_activity);
    
        MapView mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        AMap aMap = mapView.getMap();
    
        aMap.setTrafficEnabled(true);// 显示实时交通状况
        //地图模式可选类型:MAP_TYPE_NORMAL,MAP_TYPE_SATELLITE,MAP_TYPE_NIGHT
        aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式
    }
    
    }
  • 覆盖物
    public class AmapActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.basicmap_activity);
    
        MapView mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        AMap aMap = mapView.getMap();
    
        //绘制marker
        Marker marker = aMap.addMarker(new MarkerOptions()
            .position(new LatLng(39.986919,116.353369))
            .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
                .decodeResource(getResources(),R.drawable.marker)))
            .draggable(true));
    
        // 绘制曲线
        aMap.addPolyline((new PolylineOptions())
    .add(new LatLng(43.828, 87.621), new LatLng(45.808, 126.55))
    .geodesic(true).color(Color.RED));
    
    }
    
    }
  • 路径规划
    /**
     * 开始搜索路径规划方案
     */
    public void searchRouteResult(int routeType, int mode) {
        if (mStartPoint == null) {
            ToastUtil.show(mContext, "起点未设置");
            return;
        }
        if (mEndPoint == null) {
            ToastUtil.show(mContext, "终点未设置");
        }
        showProgressDialog();
        final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
            mStartPoint, mEndPoint);
        if (routeType == ROUTE_TYPE_BUS) {// 公交路径规划
            BusRouteQuery query = new BusRouteQuery(fromAndTo, mode,
                mCurrentCityName, 0);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公交查询城市区号,第四个参数表示是否计算夜班车,0表示不计算
            mRouteSearch.calculateBusRouteAsyn(query);// 异步路径规划公交模式查询
        } else if (routeType == ROUTE_TYPE_DRIVE) {// 驾车路径规划
            DriveRouteQuery query = new DriveRouteQuery(fromAndTo, mode, null,
                null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
            mRouteSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询
        } else if (routeType == ROUTE_TYPE_WALK) {// 步行路径规划
            WalkRouteQuery query = new WalkRouteQuery(fromAndTo, mode);
            mRouteSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询
        }
    }
  • POI搜索
    /**
     * 开始进行poi搜索
     */
    protected void doSearchQuery() {
        keyWord = mSearchText.getText().toString().trim();
        currentPage = 0;
        query = new PoiSearch.Query(keyWord, "", "北京市");
        query.setPageSize(20);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页
    
        if (lp != null) {
            poiSearch = new PoiSearch(this, query);
            poiSearch.setOnPoiSearchListener(this);
            poiSearch.setBound(new SearchBound(lp, 5000, true));//
            poiSearch.searchPOIAsyn();// 异步搜索
        }
    }
  • 自定义OpenGL渲染
    ...
    /**
     * 初始化AMap对象
     */
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
    
            //关闭文字
            aMap.showMapText(false);
            //关闭3d楼块
            aMap.showBuildings(false);
            //注1:设置opengl Renderer
            aMap.setCustomRenderer(new MapRenderer(aMap));
        }
    }
    ...
    
    class MapRenderer implements CustomRenderer{
        //平移位置
        private float[] translate_vector = new float[4];
        //缩放比例
        public static float SCALE = 0.005F;
        private LatLng center = new LatLng(39.90403, 116.407525);// 北京市经纬度
        private AMap aMap;
        public MapRenderer(AMap aMap) {
        this.aMap = aMap;
        aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(center,15));
    }
    
    @Override
    public void onDrawFrame(GL10 gl) {
        // 注2:绘制各种图形的opengl代码
    
    }
    ...
    
    @Override
    public void OnMapReferencechanged() {
        //注3:回调这个时,坐标系发生改变,需要重新计算缩放比例
        calScaleAndTranslate();
    
    }
    
    private void calScaleAndTranslate() {
        // 坐标会变化,重新计算计算偏移,供参考,可以自行定义
        PointF pointF = aMap.getProjection().toOpenGLLocation(center);
    
        translate_vector[0] = pointF.x;
        translate_vector[1] = pointF.y;
        translate_vector[2] = 0;
    
        //重新计算缩放比例
        LatLng latLng2 = new LatLng(center.latitude + 0.001, center.longitude + 0.001);
        PointF pointF2 = aMap.getProjection().toOpenGLLocation(latLng2);
        double _x = Math.abs((pointF.x - pointF2.x));
        double _y = Math.abs((pointF.y - pointF2.y));
        SCALE = (float) Math.sqrt((_x * _x + _y * _y));
    }
    }
  • 离线地图
    // 设置应用单独的地图存储目录,在下载离线地图或初始化地图时设置
    MapsInitializer.sdcardDir = getSdCacheDir(this);
    private String getSdCacheDir(Context context) {
             return "地址路径";
    }
    //按照citycode下载
    OfflineMapManager.downloadByCityCode(String citycode);
    //按照cityname下载
    OfflineMapManager.downloadByCityName(String cityname);
    /**
     * 点击暂停按钮响应事件回调
     */
    amapManager = new OfflineMapManager(context, OfflineMapDownloadListener );
    amapManager.pause();

下载完整示例代码

账号与Key的申请

注册成为高德开发者需要分三步:

第一步,注册高德开发者;

第二步,去控制台创建应用;

第三步,获取Key。

具体步骤可参看下图

获取 API Key

给开发者的建议

对于高德开放平台提供的地图API/SDK,若您以非商业目的使用,则均可免费使用 。若您以商业目的使用,则您需事先从高德获取商用授权。您需要先申请Key,才能使用该服务。关于具体使用规则,请参阅《高德地图开放平台服务协议》获得详细信息。 

返回顶部 示例中心 常见问题 智能客服 公众号
二维码