上一篇文章已经讲解了如何集成高德地图SDK:跳转链接
如何你想获取附近位置信息 关键字检索poi:跳转这儿
下面我们介绍下定位功能:
配置AndroidManifest文件
上一篇文章已经讲解清单文件配置: 对应的权限,服务和key值
注意:定位需要服务
<!-- 定位需要的服务 -->
<service android:name="com.amap.api.location.APSService"/>
初始化定位
先看下我们可以拿到的定位信息:
开启权限 :
//设置定位权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
} else {
// 初始化定位并设置定位回调监听
getCurrentLocationLatLng();
}
初始化定位:
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
// 同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// 设置为单次定位 : 默认为false
mLocationOption.setOnceLocation(true);
//设置定位请求超时时间 : 单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(20000);
//启动地位:
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
定位回调监听:
AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。
首先,可以判断AMapLocation对象不为空,当定位错误码类型为0时定位成功。
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (!isGpsEnabled(getApplicationContext())) {
Toast toast = Toast.makeText(getApplicationContext(), "未开启GPS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
} else {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
//获取定位信息
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
}
};
当定位成功时,可在如上判断中解析amapLocation对象的具体字段,参考如下:
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
amapLocation.getFloor();//获取当前室内定位的楼层
amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);
最后一定记得停止定位:
停止定位
mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁
销毁定位客户端
销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。
mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
下面附上完整代码如下:
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.services.core.LatLonPoint;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ActionActivity extends AppCompatActivity {
//权限设置
private static final int REQUEST_PERMISSION_LOCATION = 0;
//声明AMapLocationClient类对象
AMapLocationClient mLocationClient = null;
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
private TextView tv_action;
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
tv_action = (TextView) findViewById(R.id.tv_action);
//设置定位权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
} else {
// 初始化定位并设置定位回调监听
getCurrentLocationLatLng();
}
}
/**
* 初始化定位并设置定位回调监听
*/
private void getCurrentLocationLatLng() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
/* //设置定位场景,目前支持三种场景(签到、出行、运动,默认无场景) 设置了场景就不用配置定位模式等
option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
if(null != locationClient){
locationClient.setLocationOption(option);
//设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
locationClient.stopLocation();
locationClient.startLocation();
}*/
//选择定位模式:高德定位服务包含GPS和网络定位(Wi-Fi和基站定位)两种能力。
// 定位SDK将GPS、网络定位能力进行了封装,以三种定位模式对外开放,SDK默认选择使用高精度定位模式。
/* //只会使用网络定位
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//只使用GPS进行定位
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);*/
// 同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// 设置为单次定位 : 默认为false
mLocationOption.setOnceLocation(true);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。;
//mLocationOption.setInterval(3500);
//设置是否返回地址信息(默认返回地址信息)
/*mLocationOption.setNeedAddress(true);*/
//设置定位请求超时时间 : 单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(20000);
//设置是否开启定位缓存机制: 关闭缓存机制 默认开启 ,
// 在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。
mLocationOption.setLocationCacheEnable(false);
//启动地位:
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
/**
* 定位回调监听器
*/
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (!isGpsEnabled(getApplicationContext())) {
Toast toast = Toast.makeText(getApplicationContext(), "未开启GPS", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
} else {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
double currentLat = amapLocation.getLatitude();//获取纬度
double currentLon = amapLocation.getLongitude();//获取经度
LatLonPoint latLonPoint = new LatLonPoint(currentLat, currentLon); // latlng形式的
amapLocation.getAccuracy();//获取精度信息
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
amapLocation.getFloor();//获取当前室内定位的楼层
amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
tv_action.setText("定位时间:" + df.format(date) + "\n"
+ "地址:" + amapLocation.getAddress() + "\n"
+ "国家信息:" + amapLocation.getCountry() + "\n"
+ "省信息:" + amapLocation.getProvince() + "\n"
+ "城市信息:" + amapLocation.getCity() + "\n"
+ "城区信息:" + amapLocation.getDistrict() + "\n"
+ "街道信息:" + amapLocation.getStreet() + "\n"
+ "街道门牌号信息:" + amapLocation.getStreetNum() + "\n"
+ "城市编码:" + amapLocation.getCityCode() + "\n"
+ "地区编码:" + amapLocation.getAdCode() + "\n"
+ "获取当前定位点的AOI信息:" + amapLocation.getAoiName()
);
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (mLocationClient != null) {
//销毁定位客户端,同时销毁本地定位服务。
mLocationClient.onDestroy();
}
}
@Override
protected void onPause() {
super.onPause();
if (mLocationClient != null) {
//停止定位后,本地定位服务并不会被销毁
mLocationClient.stopLocation();
}
}
//判断GPS是否开启
private boolean isGpsEnabled(Context context) {
LocationManager locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
// 判断GPS模块是否开启
return locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
}
详细定位sdk介绍请看 高德开发指南:https://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation/
demo下载链接:https://download.csdn.net/download/shanshan_1117/10679670
demo效果图: