文章目录

  • 1. 简介
  • 2. 获取高德 Key
  • 3. 准备
  • 4. 地图
  • 5. 定位
  • 6. Poi搜索

1. 简介

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

2. 获取高德 Key

要使用高德地图首先要去高德开放平台注册成为开发者(http://lbs.amap.com/), 注册成为高德开发者需要分三步:

  • 第一步,注册高德开发者;
  • 第二步,去控制台创建应用;
  • 第三步,获取Key

3. 准备

1. 下载并解压
高德地图SDK - 开发包定制下载

2. 向工程中添加地图开发包
2.1 添加 so 文件,在 src/main/ 目录下新建 jniLibs 目录,并将文件放入其中。

2.2 将 jar 包放入 libs 目录下。然后 右键-选择 Add As Library,导入到工程中。

4. 地图

1. 配置 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.gyq.mapdemo"><!--允许程序打开网络套接字--><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" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-data android:name="com.amap.api.v2.apikey"android:value="高德key"></meta-data></application></manifest>

3. 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

4. 只要在 onCreate() 中添加如下几行代码,高德地图就显示出来了

public class MainActivity extends AppCompatActivity {private MapView mMapView;private AMap mAMap;private MyLocationStyle mLocationStyle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMapView = findViewById(R.id.map);mMapView.onCreate(savedInstanceState);if (mAMap == null) {mAMap = mMapView.getMap();}mAMap.getUiSettings().setZoomControlsEnabled(false);mAMap.moveCamera(CameraUpdateFactory.zoomTo(15));mAMap.setMapTextZIndex(2);mLocationStyle = new MyLocationStyle();mLocationStyle.interval(2000);mLocationStyle.showMyLocation(true);mAMap.setMyLocationStyle(mLocationStyle);mAMap.setMyLocationEnabled(true);mAMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {@Overridepublic void onMyLocationChange(Location location) {double lat = location.getLatitude();double lng = location.getLongitude();Log.e("duo", "onMyLocationChange: lat=" + lat + "|lng=" + lng);}});}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);}@Overrideprotected void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mMapView.onDestroy();}
}

5. 定位

  • 第一种方式
    可参考官网,链接在此:http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation/
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位回调监听
mLocationClient.setLocationListener(this);
//获取一次定位结果
mLocationOption.setOnceLocation(true);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();

之后在监听器的回调方法内解析 AMapLocation 对象,里面包含地址,省市县街道,地区编码,城市编码等等,可以在此添加标记,定位当前位置,你问我如何把标记固定在屏幕中央?也在这里面:

//----------------------这是位置改变监听------------------------------------
@Override
public void onLocationChanged(AMapLocation aMapLocation) {        if (aMapLocation != null) {            if (aMapLocation.getErrorCode() == 0) {                //可在其中解析amapLocation获取相应内容。                         LatLng latLng = new LatLng(aMapLocation.getLatitude(),       aMapLocation.getLongitude());//取出经纬度               //添加Marker显示定位位置                if (locationMarker == null) {                    //如果是空的添加一个新的,icon方法就是设置定位图标,可以自定义                    locationMarker = aMap.addMarker(new MarkerOptions()                           .position(latLng).snippet("最快1分钟到达").draggable(true).setFlat(true));                    locationMarker.showInfoWindow();//主动显示indowindow                    aMap.addText(new TextOptions().position(latLng).text(aMapLocation.getAddress()));                    //固定标签在屏幕中央                    locationMarker.setPositionByPixels(mMapView.getWidth() / 2,mMapView.getHeight() / 2);                 } else {                   //已经添加过了,修改位置即可                    locationMarker.setPosition(latLng);                }                //然后可以移动到定位点,使用animateCamera就有动画效果                aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));//参数提示:1.经纬度 2.缩放级别                        }else {                          //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。                Log.e("AmapError","location Error, ErrCode:" +aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());            }       }
}
  • 第二种方式
    实现 OnMapLoadedListener ,在回调方法中首先添加一个标记在地图中央,之后封装一个方法,开启单次定位即可:
aMap.setOnMapLoadedListener(this);
//----------------------OnMapLoaded 当地图加载完成时回调此方法------------------------------------------    @Overridepublic void onMapLoaded() {MarkerOptions markerOptions = new MarkerOptions();        markerOptions.setFlat(true);markerOptions.anchor(0.5f, 0.5f);            markerOptions.position(new LatLng(0, 0));        markerOptions.snippet("最快1分钟到达").draggable(true).setFlat(true);        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),                                R.drawable.icon_loaction_start)));mPositionMark = aMap.addMarker(markerOptions);mPositionMark.showInfoWindow();//主动显示indowindowmPositionMark.setPositionByPixels(mMapView.getWidth() / 2,mMapView.getHeight() / 2);mLocationTask.startSingleLocate();    }

封装的单次定位方法在此,很简单:

//开启单次定位
public void startSingleLocate() {AMapLocationClientOption option=new AMapLocationClientOption();option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);option.setOnceLocation(true);mLocationClient.setLocationOption(option);mLocationClient.startLocation();
}
  • 效果图

    布局文件,让按钮悬浮在地图上
<?xml version="1.0" encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"></com.amap.api.maps.MapView><!--导航栏 --><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:orientation="horizontal"><ImageViewandroid:id="@+id/menu"android:layout_width="50dp"android:layout_height="wrap_content"android:clickable="true"android:src="@mipmap/hanbao"/><ImageViewandroid:visibility="gone"android:id="@+id/btn_back"android:layout_width="50dp"android:layout_height="wrap_content"android:src="@drawable/btn_back"/><Buttonandroid:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"android:text="打车/顺风车"/></RelativeLayout><ImageView android:id="@+id/iv_location"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginRight="16dp"android:layout_marginTop="400dp"android:layout_above="@+id/fromto_container"android:src="@mipmap/btn_location"/></RelativeLayout>
</FrameLayout>

6. Poi搜索

先上效果图:

  • 实现
    这边已经提供了两个封装好的类,一个是输入提示 一个是Poi搜索
public class InputTipTask implements InputtipsListener {private static InputTipTask mInputTipTask;private Inputtips mInputTips;private RecomandAdapter mAdapter;Context mContext;public static InputTipTask getInstance(Context context, RecomandAdapter adapter){if(mInputTipTask==null){mInputTipTask=new InputTipTask(context);}        //单例情况,多次进入DestinationActivity传进来的RecomandAdapter对象会不是同一个mInputTipTask.setRecommandAdapter(adapter);return mInputTipTask;}public void setRecommandAdapter(RecomandAdapter adapter){mAdapter=adapter;}private InputTipTask(Context context ){mInputTips=new Inputtips(context, this);}public void searchTips(String keyWord, String city){try {mInputTips.requestInputtips(keyWord, city);} catch (AMapException e) {e.printStackTrace();    }
}@Overridepublic void onGetInputtips(List<Tip> tips, int resultCode) {//v3.2.1及以上版本SDK 返回码1000是正常 千万注意if(resultCode==1000&&tips!=null){ArrayList<PositionEntity> positions=new ArrayList<PositionEntity>();for(Tip tip:tips){//经纬度 address city(adcode)positions.add(new PositionEntity(0, 0, tip.getName(),tip.getAdcode()));}mAdapter.setPositionEntities(positions);mAdapter.notifyDataSetChanged();PoiSearchTask poiSearchTask=new PoiSearchTask(mContext.getApplicationContext(), mAdapter);for(int i = 0;i<positions.size();i++){PositionEntity entity = (PositionEntity)mAdapter.getItem(i);poiSearchTask.search(entity.address,RouteTask.getInstance(mContext.getApplicationContext()).getStartPoint().city);}}else {//可以根据app自身需求对查询错误情况进行相应的提示或者逻辑处理}}
}
public class PoiSearchTask implements OnPoiSearchListener {private Context mContext;private RecomandAdapter mRecommandAdapter;public PoiSearchTask(Context context, RecomandAdapter recomandAdapter) {mContext = context;mRecommandAdapter = recomandAdapter;}public void search(String keyWord, String city) {Query query = new PoiSearch.Query(keyWord, "", city);query.setPageSize(10);query.setPageNum(0);PoiSearch poiSearch = new PoiSearch(mContext, query);poiSearch.setOnPoiSearchListener(this);poiSearch.searchPOIAsyn();}@Overridepublic void onPoiSearched(PoiResult poiResult, int resultCode) {if (resultCode == 1000 && poiResult != null) {ArrayList<PoiItem> pois=poiResult.getPois();if(pois==null){return;}List<PositionEntity> entities=new ArrayList<PositionEntity>();for(PoiItem poiItem:pois){PositionEntity entity=new PositionEntity(poiItem.getLatLonPoint().getLatitude(),poiItem.getLatLonPoint().getLongitude(),poiItem.getTitle(),poiItem.getCityName());entities.add(entity);}mRecommandAdapter.setPositionEntities(entities);mRecommandAdapter.notifyDataSetChanged();}//TODO 可以根据app自身需求对查询错误情况进行相应的提示或者逻辑处理}@Overridepublic void onPoiItemSearched(PoiItem poiItem, int i) {}}

你要做的 只是拷贝这连个类到工程中,然后在搜索的Activity中实现TextWatcher接口后,进行如下调用:

//在onTextChanged方法中调用InputTipTask 的getInstance方法
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {if (RouteTask.getInstance(getApplicationContext()).getStartPoint() == null) {Toast.makeText(getApplicationContext(), "检查网络,Key等问题", Toast.LENGTH_SHORT).show();return;
}
InputTipTask.getInstance(getApplicationContext(), mRecomandAdapter).searchTips(s.toString(),RouteTask.getInstance(getApplicationContext()).getStartPoint().city);
}

输入提示完成.如果你希望点选后进行更详细的Poi搜索,也只需在相应位置调用:

//生成poiSearchTask对象
PoiSearchTask poiSearchTask=new PoiSearchTask(getApplicationContext(),mRecomandAdapter);
//开始进行POI搜索
poiSearchTask.search(mDestinaionText.getText().toString(),RouteTask.getInstance(getApplicationContext()).getStartPoint().city);

以上需要一个位置的实体Bean:

public class PositionEntity {@Overridepublic String toString() {return "PositionEntity{" + "latitue=" + latitue + ", longitude=" + longitude +", address='" + address + '\'' + ", city='" + city + '\'' + '}'; }public double latitue;public double longitude;public String address;public String city;public PositionEntity() {}public PositionEntity(double latitude, double longtitude, String address, String city) {this.latitue = latitude;this.longitude = longtitude;this.address = address;this.city = city;}
}

RouteTask 代码如下:

public class RouteTask implements OnRouteSearchListener {private static RouteTask mRouteTask;private RouteSearch mRouteSearch;private PositionEntity mFromPoint;private PositionEntity mToPoint;private List<OnRouteCalculateListener> mListeners = new ArrayList<OnRouteCalculateListener>();private DrivePath drivepath;public interface OnRouteCalculateListener {public void onRouteCalculate(float cost, float distance, int duration,DrivePath drivepath);}public static RouteTask getInstance(Context context) {if (mRouteTask == null) {mRouteTask = new RouteTask(context);}return mRouteTask;}public PositionEntity getStartPoint() {return mFromPoint;}public void setStartPoint(PositionEntity fromPoint) {mFromPoint = fromPoint;}public PositionEntity getEndPoint() {return mToPoint;}public void setEndPoint(PositionEntity toPoint) {mToPoint = toPoint;}private RouteTask(Context context) {mRouteSearch = new RouteSearch(context);mRouteSearch.setRouteSearchListener(this);}public void search() {if (mFromPoint == null || mToPoint == null) {return;}Log.e(":", "search: "+mFromPoint+","+mToPoint);FromAndTo fromAndTo = new FromAndTo(new LatLonPoint(mFromPoint.latitue,mFromPoint.longitude), new LatLonPoint(mToPoint.latitue,mToPoint.longitude));DriveRouteQuery driveRouteQuery = new DriveRouteQuery(fromAndTo,RouteSearch.DrivingDefault, null, null, "");mRouteSearch.calculateDriveRouteAsyn(driveRouteQuery);}public void search(PositionEntity fromPoint, PositionEntity toPoint) {mFromPoint = fromPoint;mToPoint = toPoint;search();}public void addRouteCalculateListener(OnRouteCalculateListener listener) {synchronized (this) {if (mListeners.contains(listener))return;mListeners.add(listener);}}public void removeRouteCalculateListener(OnRouteCalculateListener listener) {synchronized (this) {mListeners.add(listener);}}//驾车路线规划回调@Overridepublic void onDriveRouteSearched(DriveRouteResult driveRouteResult,int resultCode) {if (resultCode == 1000 && driveRouteResult != null) {synchronized (this) {for (OnRouteCalculateListener listener : mListeners) {List<DrivePath> drivepaths = driveRouteResult.getPaths();float distance = 0;int duration = 0;if (drivepaths.size() > 0) {drivepath = drivepaths.get(0);distance = drivepath.getDistance() / 1000;duration = (int) (drivepath.getDuration() / 60);}float cost = driveRouteResult.getTaxiCost();listener.onRouteCalculate(cost, distance, duration,drivepath);}List<DrivePath> paths = driveRouteResult.getPaths();}}//这里可以根据需求对查询错误情况进行相应的提示或者逻辑处理}@Overridepublic void onWalkRouteSearched(WalkRouteResult arg0, int arg1) {}@Overridepublic void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {}@Overridepublic void onBusRouteSearched(BusRouteResult arg0, int arg1) {}
}

【Android -- SDK】高德地图的使用相关推荐

  1. android 高德地图移动卡顿_Xamarin.Forms Android使用高德地图SDK

    Xamarin.Forms Android 高德演示https://www.zhihu.com/video/1243224001301958656 介绍 本编文章分为2节,第1节是介绍高德地图SDK与 ...

  2. Android 整合高德地图SDK实现 地图预览,定位,模拟导航

    一.准备工作 1. 到高德地图官方网申请key: 我的应用 | 高德控制台 2. 申请key方法请参考:获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API 3. 出现的问题 ...

  3. Android使用高德地图api实现基础定位

    Android使用高德地图api实现基础定位(一) 关于 会获取SHA1的可自行跳过这一步 第二步引用高德sdk 第三步修改MainActivity.java 关于 这篇主要讲如何使用高德sdk(不是 ...

  4. Android - 集成高德地图API(搜索,地图,定位)

    前言: 今天重构公司app的地图功能,刚好做个教程出来方便大家. 第一步: 注册高德开发用户,并来到控制台,点击应用管理->我的应用,然后创建新应用 地址:高德开放平台 | 高德地图API 点击 ...

  5. 计算机设计基于Android实现高德地图校内导航出行app【项目源码+简要论文说明】

    基于Android实现高德地图校内导航出行app项目演示 如今手机的发展非常迅速,手机越来越成为人们不可缺少的东西.手机从最初功能简单的功能机,发展到如今几乎无所不能的智能机,满足了人们的日常需求,手 ...

  6. 基于Android实现高德地图校内导航出行app项目演示【项目源码+简要论文说明】分享

    基于Android实现高德地图校内导航出行app项目演示 如今手机的发展非常迅速,手机越来越成为人们不可缺少的东西.手机从最初功能简单的功能机,发展到如今几乎无所不能的智能机,满足了人们的日常需求,手 ...

  7. android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

    原标题:Android 仿高德地图可拉伸的BottomSheet 2018安卓巴士开发者大会-上海站 你一直期待的安卓技术盛宴即将登场! 前言 最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控 ...

  8. Android实现高德地图轨迹回放

    Android实现高德地图轨迹回放 写在前面 准备 官方文档解读 创建应用: 地图api引入: 权限添加 效果展示 过程实现 地图初始化 定位 显示标记点 点平滑移动 添加呼吸点 写在结尾 写在前面 ...

  9. Android调用高德地图直接导航的简单实例

    在学校最近做了一个小APP,脑子笨怕忘,写个博客记录一下. 简单来说就是保存地点,然后单击直接打开高德地图APP并从当前所在地导航到保存的地点.因为是小型学习用的,所以保存地点采用了Android本地 ...

  10. 【Android】高德地图在Debug模式下运行正常但是打Release包时则闪退解决办法

    [Android]高德地图在Debug模式下运行正常但是打Release包时则闪退解决办法 来源: https://blog.csdn.net/weixin_39370093/article/deta ...

最新文章

  1. ASP .NET Core Web Razor Pages系列教程五:更新Razor Pages页面
  2. BCH社区为比特币现金的发展买单
  3. android100 自定义内容提供者
  4. Mesos Framework开发指南 一
  5. 吸尘器电机拆解图解_老少皆宜居家清理更轻松?吉米A6上手把无线吸尘器体验...
  6. asp.net怎么生成json数据_mysql数据库配置文件不知道怎么配置?用这个工具一键生成...
  7. 工作116:确定需求报告
  8. php接口 含义,php晋级必备:一文读懂php接口特点和使用!
  9. 卢伟冰怼荣耀V30相机被喷 卢伟冰:从不打无准备之仗
  10. linux ntfs 用户权限,linux权限及ntfs文件系统权限的知识
  11. oracle18c如何创建hr用户,Oracle18c创建不带C##的用户
  12. 在Android上使用AutoNavi Map API开发自己的地图应用程序
  13. ZZULIOJ 1010~1019(oj入门题)
  14. PDF转CAD怎么转换?(所有格式格式转换方法通用)
  15. idea安装插件时一直转解决方法
  16. Unable to load shared library ‘libgdiplus‘ or one of its dependencies
  17. 大战在即!手机芯片巨头“All in”智能汽车,5G只是冰山一角
  18. ctf php 流量分析题,CTF平台hackit题目分析与解答
  19. 安全攻访策略:PDR模型
  20. 威佐夫博弈 poj 1067

热门文章

  1. Xiaojie雷达之路---速度解模糊
  2. java qq邮箱登录_SpringBoot实现QQ邮箱注册和登录
  3. Photoshop 2023 (ps 2023)
  4. 用python写注册登录界面web_用Python实现web端用户登录和注册功能
  5. DIY空气检测仪:攀藤G5ST分析仪
  6. 现实迷途 第十三章 三兵一帅
  7. vue前端生成词云图的方法
  8. 基于FPGA的呼吸灯设计
  9. 2021总结及智能设备汇总
  10. vue+videojs视频播放、视频切换、视频断点分段上传