定位可以通过v7的LocationManager获取,还可以使用百度、高德等sdk获取定位。
权限配置
|权限 |用途| | - |- | |ACCESS_COARSE_LOCATION|用于进行网络定位| |ACCESS_FINE_LOCATION| 用于访问GPS定位。| |INTERNET|允许应用可以访问网络。|
通过v7的LocationManager获取
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
if (location == null) {
return;
}
//定位回调
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, locationListener);
定位完成后记得销毁,释放资源。 lm.removeUpdates(locationListener);
高德定位
初始化定位
//初始化定位
AMapLocationClient mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(5000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
监听定位
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
super.onLocationChanged(aMapLocation);
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
} else {
showToast(LocationError.getError(aMapLocation.getErrorCode()));
}
}
}
错误码监听
public class LocationError {
@SuppressLint("UseSparseArrays")
private static Map<Integer, String> list = new HashMap<>();
static {
list.put(0, "定位成功");
list.put(1, "一些重要参数为空,如context。");
list.put(2, "定位失败,由于仅扫描到单个wifi,且没有基站信息。");
list.put(3, "获取到的请求参数为空,可能获取过程中出现异常。");
list.put(4, "请求服务器过程中的异常,多为网络情况差,链路不通导致");
list.put(5, "请求被恶意劫持,定位结果解析失败。");
list.put(6, "定位服务返回定位失败。");
list.put(7, "KEY鉴权失败。");
list.put(8, "Android exception常规错误");
list.put(9, "定位初始化时出现异常。");
list.put(10, "定位客户端启动失败。");
list.put(11, " 请检查是否安装SIM卡,设备很有可能连入了伪基站网络。");
list.put(12, "缺少定位权限。");
list.put(13, "定位失败,由于未获得WIFI列表和基站信息,且GPS当前不可用。");
list.put(14, "GPS 定位失败,由于设备当前 GPS 状态差。");
list.put(15, "定位结果被模拟导致定位失败。");
list.put(16, "当前POI检索条件、行政区划检索条件下,无可用地理围栏");
list.put(17, "未知错误");
list.put(18, "定位失败,由于手机WIFI功能被关闭同时设置为飞行模式");
list.put(19, "定位失败,由于手机没插sim卡且WIFI功能被关闭");
}
public static String getError(int id) {
if (list.size() > id)
return list.get(id);
else
return "定位失败";
}
}