Android 定位
定位所需权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
LocationManager:
LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
Location Provider:
android系统存在多种provider
1)GPS_PROVIDER: 手机里有GPS芯片,然后利用该芯片就能利用卫星获得自己的位置信息。 第一次时间慢,但定位精准
2)NETWORK_PROVIDER:利用网络定位,一般是利用手机基站和WIFI节点的地址来大致定位位置
3)PASSIVE_PROVIDER: 被动定位方式。这个意思也比較明显。就是用现成的,当其它应用使用定位更新了定位信息。系统会保存下来。该应用接收到消息后直接读取就能够了
/**
* 判断设备 具备哪种定位provider
* <p>
* 优先采用 netWork
* <p>
* GPS 耗时耗电
*
* @param locationManager
* @return
*/
private String judgeProvider(LocationManager locationManager) {
List<String> prodiverlist = locationManager.getProviders(true);
if (prodiverlist.contains(LocationManager.NETWORK_PROVIDER)) {
return LocationManager.NETWORK_PROVIDER;//网络定位
} else if (prodiverlist.contains(LocationManager.GPS_PROVIDER)) {
return LocationManager.GPS_PROVIDER;//GPS定位 (返回时间较长 第一次可能2-5分钟)
}
return null;
}
获取定位信息
/**
* 获取定位信息
*
* @return
*/
@SuppressLint("MissingPermission")
public void getLocationInfo(Context context) {
manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (null != manager) {
String provider = judgeProvider(manager);
if (null != provider) {
/**
* 间隔时间 60 * 60 * 1000 ms
* 间隔位置 1000 m
*
* @param minTime minimum time interval between location updates, in milliseconds
* @param minDistance minimum distance between location updates, in meters
*/
manager.requestLocationUpdates(provider, 60 * 60 * 1000, 1000, locationListener);
}
}
}
private LocationListener locationListener = new LocationListener() {
/**
* 位置信息变化时触发
* @param location
*/
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "时间:" + location.getTime());
Log.i(TAG, "经度:" + location.getLongitude());
Log.i(TAG, "纬度:" + location.getLatitude());
Log.i(TAG, "海拔:" + location.getAltitude());
//解析具体详细位置信息
if (null != location) {
getAddress(location);
}
}
/**
* GPS状态变化时触发
* @param provider
* @param status
* @param extras
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
//GPS状态为可见时
case LocationProvider.AVAILABLE:
Log.i(TAG, "当前GPS状态为可见状态");
break;
//GPS状态为服务区外时
case LocationProvider.OUT_OF_SERVICE:
Log.i(TAG, "当前GPS状态为服务区外状态");
break;
//GPS状态为暂停服务时
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.i(TAG, "当前GPS状态为暂停服务状态");
break;
}
}
/**
* GPS开启时触发
*/
@Override
public void onProviderEnabled(String provider) {
}
/**
* GPS禁用时触发
*/
@Override
public void onProviderDisabled(String provider) {
}
};
获取到Location之后,根据经纬度解析出详细的位置信息:
/**
* 获取定位 详细信息
*
* @param location
* @return
*/
private List<Address> getAddress(Location location) {
List<Address> result = null;
try {
if (location != null) {
Geocoder gc = new Geocoder(context, Locale.getDefault());
result = gc.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
在Address类中会有详细位置信息内容。