2014-01-07 33 views
10

假设我的应用有5种不同的活动,它们希望使用LocationClient.getLastLocation()来获取最后一个已知位置。这看起来很简单。使熔合位置提供商LocationClient更易于使用

理想情况下,我只需在每个活动中创建一个LocationClient并调用getLastLocation()。但是,您需要做一些额外的工作才能连接到Google Play服务,例如致电LocationClient.connect(),并处理onConnectedonDisconnectedonConnectionFailed回调。文档在这里:https://developer.android.com/training/location/retrieve-current.html

据我所知,我的五个不同的活动中的每一个都必须处理LocationClient的生命周期方法。他们也不能在onCreate()中立即致电getLastLocation(),因为该活动的连接可能尚未建立。

有没有一种简单的方法来简化LocationClient的生命周期,以便getLastLocation()可以在任何新的活动中立即工作,一旦我为我的应用程序建立了一次连接?

+0

你有没有发现这个问题解决了吗? –

回答

1

你可以创建一个实现所有这些方法的基本活动,然后你所有的活动只需要扩展它。

仅供参考检查:android how to create my own Activity and extend it?

+1

不能解决能够立即在onCreate()中调用getLastLocation()的问题。每个活动仍然需要等待onConnected回调才能使用getLastLocation() – emmby

+0

@emmby您必须管理生命周期...您是否已经考虑过使用单个活动使用片段?根据您在每项活动中所做的操作,这可能无法正常工作,但如果这样做,则可以管理其所有子分段的生命周期 –

5

我已经使用融合位置提供程序API来获取定期位置更新。我已经在后台服务中实现了它(例如LocationUpdateService extends Service)。早些时候,我使用Android位置框架API,但它不适合电池使用。融合的位置提供程序API对于高效的电池使用来说是最好的选择。

我也准备了一些步骤的说明,这些步骤是实施它的必要步骤(以及其他有用的信息)。简而言之,这是迄今为止在Android平台上获取位置数据的最佳方式。 Google Play服务提供了许多位置API来获取位置数据(例如,用户的当前位置或者您可以说设备的最后一个已知位置)。

融合位置提供商是Google Play服务中的位置API之一。 这是前提条件:

  1. 谷歌播放使用服务SDK作为库项目(和谷歌也被PlayService正确安装在您的设备)。

    • 从SDK Manager下载并安装Google Play服务组件,并将该库添加到您的项目中。
    • 将您的开发项目中的android google-play-services_libGooglePlayServices库导入为Library项目。
  2. 你应该有一个实际的设备,因为这个API不能在模拟器中工作。

融合的位置提供智能管理的基本定位技术(GPS /无线网络/网络提供商的连接),使我们根据我们的需要的最佳位置。

为什么使用它

我们可以选择的位置提供商(网络或GPS),并要求位置更新的一个或设置接近警报。但是这种方法存在两个主要问题: 1.如果我们需要定义精确的位置,我们必须在网络和GPS位置提供商之间切换(因为GPS在室内不起作用)。 2.接近警报用于通知用户接近某个位置,这对电池寿命产生影响。

优势

  1. 简单的API:它让在美国的指定高一级的需要,而不必担心位置提供商,如“精度高”或“低功耗”。
  2. 电池使用效率:最大限度地降低了应用程序的用电量。根据所有传入的位置请求和可用传感器,融合位置提供商选择最有效的方式来满足这些需求。

步骤来使用该API:

  1. 声明位置相关的许可清单文件。

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    

    或者

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    
  2. 实现相关接口和回调。我们要求位置更新之前,我们必须首先实现的是位置服务使用连接状态传达给我们的应用程序接口:

    • com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks:指定方法,当位置客户端连接或断开位置服务调用。
    • com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener
  3. 连接到谷歌播放服务,连接LocationClient到谷歌API。要做到这一点,创建一个LocationClient对象(的GoogleApiClient实例)为:

    mLocationClient = new GoogleApiClient.Builder(getApplicationContext()) 
        .addApi(LocationServices.API).addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this).build(); 
    

    然后调用mLocationClient.connect();

    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 
    
  4. 检索内部onConnected(Bundle bundle)当前位置:

    Location currentLocation = fusedLocationProviderApi         .getLastLocation(mLocationClient); 
    if (mCurrentLocation != null) { 
        Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() + 
         " - " + mCurrentLocation.getLongitude()); 
    }   
    
  5. 创建并设置一个LocationRequest对象:

  6. 通过使用LocationServices类作为创建的FusedLocationProviderApi一个实例

    mLocationRequest = new LocationRequest(); 
    
    private void setLocationParameter() { 
        // Set the update interval 
        mLocationRequest.setInterval(Constants.SECONDS_TO_UP); 
        // Use high accuracy 
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
        // Set the interval ceiling to one minute 
        mLocationRequest.setFastestInterval(Constants.SECONDS_TO_UP); 
        // Set the distance to 10 meters. 
        mLocationRequest.setSmallestDisplacement(Constants.METERS_TO_UP); 
    } 
    
  7. 要从位置服务获取定期位置更新,我们使用位置客户端发送请求。

    LocationListener listener = new LocationListener() { 
        @Override 
        public void onLocationChanged(Location location) {  
         Utils.locationUpdates = Utils.locationUpdates + 1; 
         if (Utils.locationUpdates == 1) { 
          mLocationRequest .setPriority(LocationRequest.PRIORITY_LOW_POWER); 
          LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, listener); 
         } 
        } 
    }; 
    
+0

这不回答有关如何管理不同活动中的LocationServices的问题一个更聪明的方法。 – eskalera

相关问题