Android帮助文档翻译——开发指南 获取用户位置


知道用户的位置可以让你的应用程序更加智能并能够传递更好的信息给用户。当开始一个位置感知的 Android 程序时,你可以利用 GPS Android 的网络位置提供者( Location Provider )来获取用户位置。虽然 GPS 最为精确,但它只能在户外使用,比较耗电,而且不能快速获取到用户的位置。 Android 的网络位置提供者( Location Provider )利用基站和 WIFI 判断用户的位置,这种方式的定位在室内室外都可以,而且速度快、耗电少。在应用程序中可以利用 GPS 和网络提供者,或两者选一个,来获取用户的位置。  

确定用户位置的难点

利用一个移动设置来获取用户位置可能有点复杂。有很多原因会导致定位到的位置(无论是哪种方式的定位)是错误或不精确的。一些引起用户位置错误的根源如下:

1、              多位置源。 GPS 、基站 ID WIFI 都能为用户位置提供根据。确定使用和依赖哪一个信息源需要折衷考虑精度、速度和耗电情况。

2、              用户移动。因为用户位置一直在变,所以你必须频繁重新估算以记录用户的移动。

3、              多变的精度。来自于各种不同位置信息源的位置估算并没有一个连贯的精度。 10 秒前从一个信息源得到的位置可能比一个从另一信息源或同一信息得到的最新位置要精度。

这些问题会使得获取一个可依赖的用户位置显得非常困难。这个文档提供了一些信息帮助你去解决这些获取用户位置的这些难点。同时提供一些建议,让你能在你的程序中为用户提供一个精确、灵敏的地理定位体验。  

请求位置更新

在讨论上面提到的定位错误之前,这里先介绍在 Android 中如何获取用户的位置。

Android 中获取用户位置是通过回调的方法。你可以通过调用 requestLocationUpdates() 并传递进一个 LocationListener 来指出你想要从 LocationManager 中收到的位置更新。你的 LocationListener 必须实现几个方法,这些方法是在用户位置改变或服务状态改变时被位置管理器( Location Manager )调用的。

下面给出如何定义一个 LocationListener 和请求位置的代码: 

  1. // Acquire a reference to the system Location Manager   
  2. LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
  3. // Define a listener that responds to location updates   
  4. LocationListener locationListener = new LocationListener() {  
  5.     public void onLocationChanged(Location location) {  
  6.       // Called when a new location is found by the network location provider.   
  7.       makeUseOfNewLocation(location);  
  8.     }  
  9.     public void onStatusChanged(String provider, int status, Bundle extras) {}  
  10.     public void onProviderEnabled(String provider) {}  
  11.     public void onProviderDisabled(String provider) {}  
  12.   };  
  13. // Register the listener with the Location Manager to receive location updates   
  14. locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 00, locationListener);  
 requestLocationUpdates() 的第一个参数是要使用到的位置提供器类型,在这个例子中使用了基站网络位置提供器和基于位置的 WIFI 。你可以用第二个和第三个参数来控制你的监听器接收更新信息的频率,第二个参数表示两次通知之间的最小间隔时间,第三个参数表示两次通知之间最小的位置更改距离,如果都设置为 0 表示尽可能快地去请求位置通知。最后一个参数是就你定义的接收位置更新回调的 LocationListener

如果要通过 GPS 提供器请求用户位置更新就要用 GPS_PROVIDER 代替 NETWORK_PROVIDER 。你也可以通过调用两次 requestLocationUpdates() 并分别传入 NETWORK_PROVIDER GPS_PROVIDER 来同时使用 GPS 和网络定位提供器请求位置更新。  

请求用户权限

为了能从 NETWORK_PROVIDER GPS_PROVIDER 接收到位置更新,你必须在 manifest 文件中定义 ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION 权限来请求用户权限。代码如下: 

  1. <manifest ... >  
  2.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  3.     ...  
  4. </manifest>   

如果没有申请这些权限,你的应用程序将无法在运行时请求位置更新。

注:如果你需要通过 NETWORK_PROVIDER GPS_PROVIDER 两种方式同时定位,那么你只需要申请一个 ACCESS_FINE_LOCATION 权限就行,因为这个权限对于这两种定位方式都适应,而 ACCESS_COARSE_LOCATION 权限只是对于 NETWORK_PROVIDER 方式适应。 

定义一个最佳执行模型

基于位置的应用程序目前已经相当普遍了,但由于缺乏最佳精度、用户移动、获取位置方式的多样性和节省电池等等原因,使得获取用户位置显得很复杂。在节省电池的情况下,为了克服获取一个准确用户位置的难点,你必须定义一个能指定你的应用程序如何获取用户位置的稳定模型。这个模型包括了何时开始和停止监听更新信息,以及何时使用获取到的位置数据。  

  • 1
  • 2
  • 3
  • 下一页

相关内容