现在集成地图的APP无非是外卖,滴滴,物流,车载导航等一些需要获取当前目标位置目标信息。不过,目前开放的地图中有两个非常有实力的门派,分别是高德和百度,高德地图当我看见它的文档的时候我就注定使用它了,文档确实不过错还自带效果图。 文档本人是个未满一年经验的小新,正在进行Android修仙之路,由于没有师傅只能单兵作战,在修仙过程之中不断通过实战提高自己的修为。若对实战过程中有误的地方希望道友帮忙指正,不然本人将误入歧途最终成魔(哈哈)。在实战过程之前小辈会参考其他前辈的实战经验,这也是大多修真者都会这么做的,所以在实战过程中都不是原创。
准备资源
创建应用
老规矩还没高德账号的先去官网申请一下,注册登入完成之后右上角进入控制台。
打开应用管理 右上角创建一个应用,创建完成之后添加key 添加key 填写信息key名称可以查看命令规范来写,然后就是你项目的包名,接下来就是需要获取SHA1,获取SHA1之后填入两个SHA1编辑框中即可。
获取SHA1
这里我就拷贝官网的图片。 打开控制台 切换目录 添加命令 拷贝SHA1下载SDK
点我下载SDK,地图这里的话我选择3D地图,2D的话没那么真实体验感更不好。
选择SDK导入SDK
将下载好的SDK进行解压,切换project在main/java下创建jniLibs目录,将各平台的so包拷贝到此目录下,将jar包放入libs目录下。 导入SDK添加权限
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
添加key并引入服务
<application>
<meta-data android:name="com.amap.api.v2.apikey" android:value="您的key"></meta-data>
<service android:name="com.amap.api.location.APSService"></service>
</application>
定位
介绍
高德定位有多种方式,如下图。 定位方式移动互联时代,定位无处不在,任何一个应用只要想了解用户的位置,不管是为用户提供服务还是用于用户分析,就一定会用到定位。
高德定位需要使用到的对象有两个,分别是AMapLocationClient和AMapLocationClientOption。
- AMapLocationClient:这个是定位服务类。提供单次定位、持续定位、位置相关功能。
- AMapLocationClientOption:这个是定位参数设置,通过这个类可以对定位的相关参数进行设置,比如定位的时间间隔,定位模式等。
编写流程
1.初始化AMapLocationClient和AMapLocationClientOption
//初始化AMapLocationClient
mLocationClient = new AMapLocationClient(getApplicationContext());
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
2.根据自己的业务需求设置定位参数
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000*60);
//设置定位参数
mLocationClient.setLocationOption(mLocationOption);
更多参数如下如图:
返回值 | 方法名 | 解释 |
---|---|---|
boolean | [isGpsFirst() | 获取高精度模式下单次定位是否优先返回卫星定位信息 |
boolean | isKillProcess() | 退出时是否杀死进程 |
boolean | isMockEnable() | 是否允许模拟位置 |
boolean | isNeedAddress() | 是否需要地址信息 |
boolean | isWifiScan() | 是否允许主动调用WIFI刷新 |
AMapLocationClientOption | setGeoLanguage() | 设置逆地理信息的语言,目前之中中文和英文 |
AMapLocationClientOption | setGpsFirst() | 设置首次定位是否等待卫星定位结果 |
AMapLocationClientOption | setHttpTimeOut() | 设置联网超时时间 |
AMapLocationClientOption | setLocationCacheEnable() | 设置是否使用缓存策略 |
AMapLocationClientOption | setLocationPurpose() | 设置定位场景 |
AMapLocationClientOption | setMockEnable() | 设置是否允许模拟位置 |
AMapLocationClientOption | setOnceLocationLatest() | 设置定位是否等待WIFI列表刷新 定位 |
AMapLocationClientOption | setSensorEnable() | 是否使用设备传感器 |
AMapLocationClientOption | setWifiScan() | 设置是否允许调用WIFI刷新 |
3.监听位置的改变
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//声明定位回调监听器
private AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
Log.d(TAG,"onLocationChanged " + aMapLocation.toStr());
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("国家: " + aMapLocation.getCountry() +"\n");
stringBuffer.append("省: " + aMapLocation.getProvince()+"\n");
stringBuffer.append("城市: " + aMapLocation.getCity()+"\n");
stringBuffer.append("城区: " + aMapLocation.getDistrict()+"\n");
stringBuffer.append("街道: " + aMapLocation.getStreet()+"\n");
stringBuffer.append("街道门牌号: " + aMapLocation.getStreetNum()+"\n");
stringBuffer.append("城市编码: " + aMapLocation.getCityCode()+"\n");
stringBuffer.append("区域编码: " + aMapLocation.getAdCode()+"\n");
stringBuffer.append("地址描述: " + aMapLocation.getAddress()+"\n");
stringBuffer.append("定位类型: " + aMapLocation.getLocationType()+"\n");
stringBuffer.append("获取纬度: " + aMapLocation.getLatitude()+"\n");
stringBuffer.append("获取经度: " + aMapLocation.getLongitude()+"\n");
stringBuffer.append("海拔: " + aMapLocation.getAltitude()+"\n");
stringBuffer.append("速度: " + aMapLocation.getSpeed()+"\n");
stringBuffer.append("方向角: " + aMapLocation.getBearing()+"\n");
stringBuffer.append("室内定位建筑物Id: " + aMapLocation.getBuildingId()+"\n");
stringBuffer.append("室内定位楼层: " + aMapLocation.getFloor()+"\n");
stringBuffer.append("当前位置POI名称: " + aMapLocation.getPoiName()+"\n");
stringBuffer.append("当前位置所处AOI名称: " + aMapLocation.getAoiName()+"\n");
stringBuffer.append("设备当前 GPS 状态: " + aMapLocation.getGpsAccuracyStatus()+"\n");
stringBuffer.append("定位来源: " + aMapLocation.getLocationType()+"\n");
stringBuffer.append("定位信息描述: " + aMapLocation.getLocationDetail()+"\n");
stringBuffer.append("获取精度信息: " + aMapLocation.getAccuracy()+"\n");
stringBuffer.append("获取定位提供者: " + aMapLocation.getProvider()+"\n");
stringBuffer.append("当前卫星数量: " + aMapLocation.getSatellites()+"\n");
stringBuffer.append("定位结果的可信度 : " + aMapLocation.getTrustedLevel()+"\n");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
stringBuffer.append("定位时间: " + df.format(date));
Log.d(TAG,stringBuffer.toString());
mTvContent.setText(stringBuffer.toString());
//具体
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.d(TAG, "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
};
4.开始定位
mLocationClient.startLocation();
5.onDestory()中释放资源
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stopLocation();
mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
mLocationClient = null;
}
测试结果,记得打开位置信息哦。
测试结果
地图
高德开放平台提供2D,3D,卫星多种地图形式供开发者选择,无论基于哪种平台,都可以通过高德开放平台提供的API和SDK轻松的完成地图的构建工作。同时我们还提供强大的地图再开发能力,全面的地图数据支持,离线在线两种使用方式,多种地图交互模式,满足各个场景下对地图的需求。
高德将地图已经封装成一个MapView,首先我们需要在xml中引入这个控件。
<com.amap.api.maps.MapView
android:id="@+id/amap_map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
接下来在Activity生命周期中设置MapView的状态
public class AMapActivity extends AppCompatActivity {
private MapView mMapView;
private AMap mAMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_amap);
mMapView = findViewById(R.id.amap_map_view);
//创建地图
mMapView.onCreate(savedInstanceState);
if (mAMap == null) {
mAMap = mMapView.getMap();
}
}
@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);
}
}
上面在onCrate中创建地图后再调用getMap()获取AMap对象,那么AMap对象是来干啥的?
下面看看运行效果 运行效果AMap 类是地图的控制器类,用来操作地图。它所承载的工作包括:地图图层切换(如卫星图、黑夜地图)、改变地图状态(地图旋转角度、俯仰角、中心点坐标和缩放级别)、添加点标记(Marker)、绘制几何图形(Polyline、Polygon、Circle)、各类事件监听(点击、手势等)等,AMap 是地图 SDK 最重要的核心类,诸多操作都依赖它完成。
咦!地图怎么显示的是北京的啊而且还没有那个自身位置标识的蓝点,很明显不对,别急,我们还需要进行定位,因为MapView默认加载的是位置是北京。
网友评论