高德地图二:Android中GPS的核心API、LocationProvider、临近警告等
Android:支持GPS的核心API
一、LocationManager类
作用和TelephonyManager,AudioManager等服务类的作用类似,所有GPS定位相关的服务、对象都由该对象产生;
通过调用Context.getSystemService()方法获取实例对象;
LocationManager lm=(LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
提供如下方法:
boolean addGpsStatusListener(GpsStatus.Listener listener):添加一个监听GPS状态的监听器;
void addProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent):添加一个临近警告;
List<String> getAllProviders():获取所有的LocationProvider列表;
String getBestProvider(Criteria criteria,boolean enabledOnly):根据制定条件返回最优的LocationProvider对象;
GpsStatus getGpsStatus(GpsStatus status):获取GPS状态;
Location getLastKnownLocation(String provider):根据LocationProvider获取最近一次已知的Location;
LocationProvider getProvider(String name):根据名称来获取LocationProvider;
List<String> getProviders(Criteria criteria,boolean enabledOnly):根据制定条件获取满足条件的全部LocationProvier的名称;
List<String> getProviders(boolean enabledOnly):获取所有可用的LocationProvider;
boolean isProviderEnabled(String provider):判断制定名称的LocationProvider是否可用;
void removeGpsStatusListener(GpsStatus.Listener listener):删除GPS状态监听器;
void removeProximityAlert(PendingIntent intent):删除一个趋近警告;
void requestLocationUpdates(String provider,long minTime,float minDistance,PendingIntent intent):通过指定的LocationProvider周期性获取定位信息,并通过Intent启动相应的组件;
void requestLocationUpdates(String provider,long minTime,float minDistance,LcoationListener listener):通过指定的LocationProvider周期性的获取定位信息,并触发listener对应的触发器;
二、LocationProvider类
定位组件的抽象标识,通过它可以获取定位的相关信息;
提供如下常用方法:
String getName():返回该LocationProvider的名称;
int getAccuracy():返回该LocationProvider的精度;
int getPowerRequirement():返回该LocationProvider的电源需求;
boolean hasMonetaryCost():返回LocationProvider是收费还是免费;
boolean meetsCriteria(Criteria criteria):判断该LocationProvider是否满足Criteria条件;
boolean requiresCell():判断该LocationProvider是否需要访问网路基站;
boolean requiresNetword():判断该LocationProvider是否需要网路数据;
boolean requiresStatellite():判断该LocationProvider是否需要访问卫星的定位系统;
boolean supportsAltitude():判断该LocationProvider是否支持高度信息;
boolean supportsBearing():判断该LocationProvider是否支持方向信息;
boolean supportsSpeed():判断该LocationProvider是否支持速度信息;
三、Location类
代表位置信息的抽象类
提供如下方法来获取定位信息:
float getAccuracy():获取定位信息的精度;
double getAltitude():获取定位信息的高度;
float getBearing():获取定位信息的方向;
double getLatitude():获取定位信息的经度;
double getLongitude():获取定位信息的纬度;
String getProvider():获取提供该定位信息的LocationProvider;
float getSpeed():获取定位信息的速度;
boolean hasAccuracy():判断该定位信息是否有经度信息;
boolean hasAltitude():判断定位信息是否有高度信息;
boolean hasBearing():判断定位信息是否有方向信息;
boolean hasSpeed():判断定位信息是否有速度信息;
四、获取GPS信息的通用步骤
获取LocationManager对象;
使用LocationManager,通过制定LocationProvider来获取定位信息,定位信息由Location表示;
获取LocationProvider
LocationProvider通常有三个:
> passive: 由LocationManager.PASSIVE_PROVIDER常量表示
> gps: 由LocationManager.GPS_PROVIDER常量表示,代表通过GPS获取定位信息的LocationProvider对象
> network: 由LocationManager.NETWORK_PROVIDER常量表示,代表通过移动通信网络获取定位信息的LocationProvider对象
1,获取所有可用的LocationProvider
List<String> providerNames=lm.getAllProviders();
2. 通过名称获得指定LocationProvider
//获得基于GPS的LocationProvider
LocationProvider gpsProvider=lm.getProvider(LocationManager.GPS_PROVIDER);
3. 根据Criteria获取LocationProvider
LocationManager的getBestProvider(Criteria criteria,boolean enabledOnly)用来得到符合指定条件的LocationProvider。
Criteria代表了一个过滤条件,提供如下常用方法来设置:
> setAccuracy(int accuracy): 设置对LocationProvider的精度要求
> setAltitudeRequired(boolean altitudeRequired): 设置要求LocationProvider能提供高度信息
> setBearingRequired(boolean bearingRequired): 设置要求LocationProvider能提供方向信息
> setCostAllowed(boolean costAllowed): 设置要求LocationProvider是否免费
> setPowerRequirement(int level): 设置要求LocationProvider的耗电量
> setSpeedRequired(boolean speedRequired): 设置要求LocationProvider能提供速度信息
实例:
lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria cri=new Criteria();
cri.setCostAllowed(false);
cri.setAltitudeRequired(true);
cri.setBearingRequired(true);
List<String> providerNames=lm.getAllProviders();
实例:通过手机实时获取定位信息,包括用户所在的经度、纬度、高度、方向、移动速度等
public class LocationActivity extends Activity {
LocationManager lm;
EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
show=(EditText) findViewById(R.id.show);
lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
//从GPS获取最近的定位信息
Location location=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Log.i("LocationActivity", "location="+location);
updateView(location);
//每3秒获取一次GPS的定位信息
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 8, new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
// 当GPS LocationProvider可用时,更新位置
updateView(lm.getLastKnownLocation(provider));
}
@Override
public void onProviderDisabled(String provider) {
updateView(lm.getLastKnownLocation(null));
}
@Override
public void onLocationChanged(Location location) {
//GPS定位信息发生改变时,更新位置
updateView(location);
}
});
}
public void updateView(Location newLocation){
if(newLocation!=null){
StringBuilder sb=new StringBuilder();
sb.append("实时的位置信息:\n");
sb.append("经度:");
sb.append(newLocation.getLongitude());
sb.append("\n纬度:");
sb.append(newLocation.getLatitude());
sb.append("\n高度:");
sb.append(newLocation.getAltitude());
sb.append("\n速度:");
sb.append(newLocation.getSpeed());
sb.append("\n方向:");
sb.append(newLocation.getBearing());
show.setText(sb.toString());
}else{
show.setText("");
}
}
}
临近警告
LocationManager提供一个方法addProximityAlert(double latitude,double longitude,float radius, long expiration, PendingIntent intent)用于
添加一个临近警告。当用户手机不断临近指定固定点时,当与该固定点的距离小于指定范围时,系统可以触发相应的处理。
参数说明:
latitude:指定固定点的精度
longitude:指定固定点的纬度
radius:指定一个半径长度
expiration:指定经过多少毫秒后该临近警告就会过期失效,-1表示永不过期
intent:指定临近该固定点时触发该intent对应的组件
实例:
public class ProximityTestActivity extends Activity {
LocationManager lm;
double longitude=113.39;
double latitude=23.13;
float radius=5000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_proximity_test);
lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
Intent intent=new Intent(this,ProximityAlertReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(this, -1, intent, 0);
//第四个参数指定经过多少毫秒后该临近警告就会过期失效,-1指定永不过期
lm.addProximityAlert(latitude, longitude, radius, -1, pi);
}
public class ProximityAlertReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
boolean isEnter=intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
if(isEnter){
Toast.makeText(context, "你已进入禁止区域", 0).show();
}else{
Toast.makeText(context, "你离开禁止区域", 0).show();
}
}
}
}