高德地图二:Android中GPS的核心API、LocationProvider、临近警告等

高德地图二: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 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 getProviders(Criteria criteria,boolean enabledOnly):根据制定条件获取满足条件的全部LocationProvier的名称; 

		List 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 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 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();
					}
				}
			}
		}

你可能感兴趣的:(Android基础)