Android开发--用户定位服务--UserLocation
2013-01-28 08:32:26 我来说两句 作者:BruceZhang
收藏 我要投稿
[java]
<span style="background-color: rgb(243, 248, 251); font-family: simsun;">用户定位介绍:</span>
User Location的作用:
1.获取用户的位置
2.追踪用户的移动
User Location的关键API
1.Location Manager:用于管理Android的用户定位服务
2.Location Providers:提供多种定位方式供开发者选择。
<1>GPS Provider
<2>Network Provider
<3>Passive
定位方式的分类:
1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:
android.permission.ACCESS_FINE_LOCATION
2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:
android.permission.ACCESS_FINE_LOCATION
或
android.permission.ACCESS_COARSE_LOCATION
以上两种定位方式的区别是GPS定位精度更高,但同时也更耗电
获取用户的当前位置:
1.在AndroidManifest.xml当中声明相应的权限;
2.获取LocationManager对象;
3.选择LocationProvider;
4.绑定LocationListener对象。
LocationListener有四个方法:
1.onLocationChanged(Location location):当设备的位置发生改变时调用
我们可以调用location.getLongitude()和location.getLatitude()来得到设备所处的经度和纬度
2.onProviderDisabled(String provider):当提供数据Provider禁用时调用
3.onProviderEnabled(String provider):当提供数据的Provider使用时调用
4.onStatusChanged(String provider,int status,Bundle extras):当状态改变时
我们需要实现LocationListener的以上四个方法:
[java]
<span style="font-size:18px;">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
}
}</span>
测试当前设备的LocationProvider
由于一般的设备存在不止一种定位方法,所以在这里给出查找定位服务的方法:
[java]
<span style="font-size:18px;">List<String> providers=locationManager.getAllProviders();
for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){
String string=(String)iterator.next();
Log.d("BruceZhang", string+" ");</span>
由于有多个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,下面是文档上对设置条件的解释:
[java] view plaincopy
<span style="font-size:18px;">void setAccuracy(int accuracy)
Indicates the desired accuracy for latitude and longitude.</span>
[java]
<span style="font-size:18px;">
void setAltitudeRequired(boolean altitudeRequired)
Indicates whether the provider must provide altitude information.</span>
[java]
<span style="font-size:18px;">
void setBearingAccuracy(int accuracy)
Indicates the desired bearing accuracy.</span>
[java
<span style="font-size:18px;">
void setBearingRequired(boolean bearingRequired)
Indicates whether the provider must provide bearing information.</span>
[java]
<span style="font-size:18px;">
void setCostAllowed(boolean costAllowed)
Indicates whether the provider is allowed to incur monetary cost.</span>
[java]
<span style="font-size:18px;">
void setHorizontalAccuracy(int accuracy)
Indicates the desired horizontal accuracy (latitude and longitude).</span>
[java]
<span style="font-size:18px;">
void setPowerRequirement(int level)
Indicates the desired maximum power level.</span>
[java]
<span style="font-size:18px;">
void setSpeedAccuracy(int accuracy)
Indicates the desired speed accuracy.</span>
[java] view plaincopy
<span style="font-size:18px;">
void setSpeedRequired(boolean speedRequired)
Indicates whether the provider must provide speed information.</span>
[java] view plaincopy
<span style="font-size:18px;">
void setVerticalAccuracy(int accuracy)
Indicates the desired vertical accuracy (altitude).</span>
追踪用户的位置:
对用户的位置进行更新用到的方法和解释如下:
[java]
// 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:
一下是实现的源代码:
[java]
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+" ");
}
}
}
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 www.2cto.com
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;
}
}