GPS
定位系统由三部分组成,即由GPS
卫星组成的空间部分,若干地面组成的控制部分和普通用户手中的接收机这三部分。对于手机用户来说,手机就是GPS
定位系统的接收机,也就是说GPS
定位需要手机的硬件支持GPS
功能。
权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
一、LocationManager
位置管理类,其主要功能包括:
// 根据LocationProvider获取最近一次已知的Location
Location getLastKnownLocation(String provider);
//获取所有的LocationProvider列表
List<String> getAllProviders();
//根据指定条件返回最优的LocationProvider对象
String getBestProvider(Criteria criteria,boolean enabledOnly);
//根据名称来获取LocationProvider
LocationProvider getProvider(String name):
//根据指定条件获取满足该条件的全部LocationProvider的名称
List<String> getProviders(Criteria criteria,boolean enabledOnly):
// 获取所有可用的LocationProvider
List<String> getProviders(boolean enabledOnly):
//判断指定名称的LocationProvider是否可用
boolean isProviderEnabled(provider):
// 获取GPS状态
GpsStatus getGpsStatus(GpsStatus status);
//添加一个监听GPS状态的监听器
boolean addGpsStatusListener(GpsStatus.Listener listener);
//删除Gps状态监听器
void removeGpsStatusListener(GpsStatus.Listener listener):
//通过指定的LoactionProvider周期性地获取定位信息,并通过intent启动相应的组件
void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent):
// 通过指定的LocationProvider周期性地获取定位信息,并触发listener所对应的触发器
void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener):
//添加一个临近警告
void addProximityAlert(double latitude,double longitude,float radius, long expiration, PendingIntent intent);
// 删除一个临近警告
void removeProximityAlert(PendingIntent intent):
二、LocationProvider
位置提供类,其主要功能包括:
//返回该LocationProvider的精度
int getAccuracy();
// 返回该LocationProvider的名称
String getName();
//获取该LocationProvider的电源需求
int getPowerRequirement();
//获取该LocationProvider是收费的还是免费的
boolean hasMonetaryCost();
//判断该LocationProvider是否满足Criteria条件
boolean meetsCriteria(Criteria criteria) ;
// 判断该LocationProvider是否需要访问网络基站
boolean requiresCell();
//判断该LocationProvider是否需要网络数据
boolean requiresNetwork();
//判断该LocationProvider是否需要访问基于卫星的定位系统
boolean requiresSatellite();
//判断该LocationProvider是否支持高度信息
boolean supportsAltitude();
//判断该LocationProvider是否支持方向信息
boolean supportsBearing();
// 判断该LocationProvider是否支持速度信息
boolean supportsSpeed();
三、Location
代表位置的抽象类,主要方法包括:
//获取定位信息的精度
float getAccuracy();
//获取定位信息的高度
double getAltitude();
//获取定位信息的方向
float getBearing();
//获取定位信息的纬度
getLatitude();
// 获取定位信息的经度
getLongitude();
// 获取提供该定位信息的LocationProvider
getProvider();
//获取定位信息的速度
getSpeed();
//判断该定位信息是否有精度信息
hasAccuracy();
// 判断该定位信息是否有高度信息
hasAltitude();
//判断该定位信息是否有方向信息
hasBearing();
//判断该定位信息是否有速度信息
hasSpeed();
以上三个类是Android GPS
的三个核心API
,用它们来获取GPS
定位信息的步骤为:
- 获取系统的
LocationManager
对象。 - 使用
LocationManager
,通过指定LocationProvider
来获取定位信息,定位信息由Location
对象来表示。 - 从
Location中
获取定位信息。
四、Criteria
除了以上三个核心类之外,Criteria
这个类也很重要。
LocationManager
的getBestProvider(Criteria criteria,boolean enabledOnly)
用来得到符合指定条件的LocationProvider
。Criteria
代表了一个过滤条件,提供如下常用方法来设置:
//设置对LocationProvider的精度要求
setAccuracy(int accuracy);
//设置要求LocationProvider能提供高度信息
setAltitudeRequired(boolean altitudeRequired);
//设置要求LocationProvider能提供方向信息
setBearingRequired(boolean bearingRequired);
//设置要求LocationProvider是否免费
setCostAllowed(boolean costAllowed);
//设置要求LocationProvider的耗电量
setPowerRequirement(int level);
//设置要求LocationProvider能提供速度信息
setSpeedRequired(boolean speedRequired);
五、基本使用
/**
* 开始定位
*/
public void startLocation(Context mContext, LocationCallback listener) {
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String best = locationManager.getBestProvider(criteria, true);
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(mContext, 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;
}
this.listener = listener;
locationManager.requestLocationUpdates(best, intervalTime, 0, MyLocationListener);
}
/**
* 位置监听
*/
private LocationListener MyLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (listener != null && location != null) {
listener.onLocation(location.getLatitude() + "", location.getLongitude() + "");
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
网友评论