`
nanjingjiangbiao_T
  • 浏览: 2572358 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android开发--用户定位服务--UserLocation

 
阅读更多
用户定位介绍:

User Location的作用:
1.获取用户的位置
2.追踪用户的移动

User Location的关键API
1.Location Manager:用于管理Android的用户定位服务
2.Location Providers:提供多种定位方式供开发者选择。
<wbr>&lt;1&gt;GPS Provider</wbr>
<wbr>&lt;2&gt;Network Provider</wbr>
<3>Passive

定位方式的分类:
1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:
<wbr><wbr>android.permission.ACCESS_FINE_LOCATION</wbr></wbr>

2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:
<wbr><wbr>android.permission.ACCESS_FINE_LOCATION</wbr></wbr>
<wbr>或</wbr>
<wbr><wbr>android.permission.ACCESS_COARSE_LOCATION</wbr></wbr>
以上两种定位方式的区别是GPS定位精度更高,但同时也更耗电

获取用户的当前位置:
1.在AndroidManifest.xml当中声明相应的权限;
2.获取LocationManager对象;
3.选择LocationProvider;
4.绑定LocationListener对象。


LocationListener有四个方法:
1.onLocationChanged(Location location):当设备的位置发生改变时调用
<wbr><wbr>我们可以调用location.getLongitude()和location.getLatitude()来得到设备所处的经度和纬度</wbr></wbr>
2.onProviderDisabled(String provider):当提供数据Provider禁用时调用
3.onProviderEnabled(String provider):当提供数据的Provider使用时调用
4.onStatusChanged(String provider,int status,Bundle extras):当状态改变时


我们需要实现LocationListener的以上四个方法:
private class TestLocationListener implements LocationListener{
    @Override
    public void onLocationChanged(Location location){
        System.out.println(location.getLongitude());
        System.out.println(location.getLatitude());
    }
  
    @Override
    public void onProviderDisabled(String provider){
        // do something you need
    }
 
    @Override
    public void onProviderEnabled(String provider){
        // do something you need
    }

    @Override
    public void onStatusChanged(String provider,int status,Bundle extras){
        // do something you need
    }
}

测试当前设备的LocationProvider
由于一般的设备存在不止一种定位方法,所以在这里给出查找定位服务的方法:
List<String> providers=locationManager.getAllProviders();
			for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){
				String string=(String)iterator.next();
				Log.d("BruceZhang", string+"\n");

由于有多个Provider,那么就需要做出选择,在这里给出选择最好的Provider的方法:
此时需要用到一个类--Criteria
下面是在Android SDK文档上给出的解释:
A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.

它提供了一系列的方法,设置用户的需求,并最终给出用户所需要的最佳的Provider,下面是文档上对设置条件的解释:

void	 setAccuracy(int accuracy)
Indicates the desired accuracy for latitude and longitude.

void	 setAltitudeRequired(boolean altitudeRequired)
Indicates whether the provider must provide altitude information.

void	 setBearingAccuracy(int accuracy)
Indicates the desired bearing accuracy.

void	 setBearingRequired(boolean bearingRequired)
Indicates whether the provider must provide bearing information.

void	 setCostAllowed(boolean costAllowed)
Indicates whether the provider is allowed to incur monetary cost.

void	 setHorizontalAccuracy(int accuracy)
Indicates the desired horizontal accuracy (latitude and longitude).

void	 setPowerRequirement(int level)
Indicates the desired maximum power level.

void	 setSpeedAccuracy(int accuracy)
Indicates the desired speed accuracy.

void	 setSpeedRequired(boolean speedRequired)
Indicates whether the provider must provide speed information.

void	 setVerticalAccuracy(int accuracy)
Indicates the desired vertical accuracy (altitude).

追踪用户的位置:
对用户的位置进行更新用到的方法和解释如下:
//			public void requestLocationUpdates (String provider, 
//			long minTime, float minDistance, LocationListener listener) 
//			Added in API level 1
//			Register for location updates using the named provider, and a pending intent. 
//
//			Parameters
//			provider  the name of the provider with which to register 
//			minTime  minimum time interval between location updates, in milliseconds 
//			minDistance  minimum distance between location updates, in meters 
//			listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update 
			
			locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
					0, new TestLocationListener());

下面,给出一个例子,实现用户的定位,取得支持的LocationProvider,根据条件获取最佳的Provider:
一下是实现的源代码:
public class MainActivity extends Activity {
	private Button button;
	private Button button2;
	private Button button3;
	private Button button4;
	private LocationManager locationManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button=(Button)findViewById(R.id.button1);
		button2=(Button)findViewById(R.id.button2);
		button3=(Button)findViewById(R.id.button3);
		button4=(Button)findViewById(R.id.button4);
		button.setOnClickListener(new ButtonListener());
		button2.setOnClickListener(new ProviderButtonListener());
		button3.setOnClickListener(new BestProviderButtonListener());
		button4.setOnClickListener(new MyLocation());
		
		locationManager=(LocationManager)MainActivity.this.
				getSystemService(Context.LOCATION_SERVICE);
	}
	
	private class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
//			LocationManager locationManager=(LocationManager)MainActivity.this.
//					getSystemService(Context.LOCATION_SERVICE);
			/*
			 * 各个参数的意义:
			 * 1.定义当前所使用的Location Provider
			 * 2.位置更新一次的最小时间间隔
			 * 3.位置更新的最小距离
			 * 4.绑定监听器--位置发生变化会调用其中的方法
			 */
			Log.d("BruceZhang", "Bond Success");
//			public void requestLocationUpdates (String provider, 
//			long minTime, float minDistance, LocationListener listener) 
//			Added in API level 1
//			Register for location updates using the named provider, and a pending intent. 
//
//			Parameters
//			provider  the name of the provider with which to register 
//			minTime  minimum time interval between location updates, in milliseconds 
//			minDistance  minimum distance between location updates, in meters 
//			listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update 
			
			locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
					0, new TestLocationListener());
		}
		
	}
	
	private class ProviderButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			List<String> providers=locationManager.getAllProviders();
			for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){
				String string=(String)iterator.next();
				Log.d("BruceZhang", string+"\n");
			}
		}
		
	}
	
	private class BestProviderButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Criteria criteria=new Criteria();
			criteria.setAccuracy(Criteria.ACCURACY_FINE);
			criteria.setPowerRequirement(Criteria.POWER_LOW);
			criteria.setAltitudeRequired(false);
			criteria.setSpeedRequired(false);
			criteria.setCostAllowed(false);
			//第二个参数设置为false时,不管当前的那个provider是否可用,都需要进行查找,并根据条件设为最优
			String provider=locationManager.getBestProvider(criteria, false);
			Log.d("BruceZhang", "The best provider is:"+provider);
		}
		
	}
	
	private class MyLocation implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//对用用户定位服务主要是中间两个参数的设置
			locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 
					2000, new TestLocationListener());
		}
		
	}
	
	private class TestLocationListener implements LocationListener{
  
		//这个函数的参数是用户当前的位置
		@Override
		public void onLocationChanged(Location arg0) {
			// TODO Auto-generated method stub
//			Toast.makeText(MainActivity.this, "您当前的经度是:"+arg0.getLongitude()+" ,"+
//			"您当前的纬度是:"+arg0.getLatitude(),
//					Toast.LENGTH_SHORT).show();
			Log.d("BruceZhang", arg0.getLongitude()+"");
			Log.d("BruceZhang", arg0.getLatitude()+"");
		}

		@Override
		public void onProviderDisabled(String arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onProviderEnabled(String arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
			// TODO Auto-generated method stub
			
		}
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics