高德地图在Android中的使用-定位
- 配置
- 代码解析
- 效果展示
- 参考内容
配置
AMap_Location–>高德定位服务包
AMap_Search–>高德搜索服务包
AMap_Map3D–>高德3D地图服务包,注意3D地图需要添加so库,实现对不同CPU架构的支持
接下来进行项目的配置,通过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;
}
}
}
效果展示
参考内容
- 高德开放平台:http://lbs.amap.com/