我已经使用融合位置提供程序API来获取定期位置更新。我已经在后台服务中实现了它(例如LocationUpdateService extends Service
)。早些时候,我使用Android位置框架API,但它不适合电池使用。融合的位置提供程序API对于高效的电池使用来说是最好的选择。
我也准备了一些步骤的说明,这些步骤是实施它的必要步骤(以及其他有用的信息)。简而言之,这是迄今为止在Android平台上获取位置数据的最佳方式。 Google Play服务提供了许多位置API来获取位置数据(例如,用户的当前位置或者您可以说设备的最后一个已知位置)。
融合位置提供商是Google Play服务中的位置API之一。 这是前提条件:
谷歌播放使用服务SDK作为库项目(和谷歌也被PlayService正确安装在您的设备)。
- 从SDK Manager下载并安装Google Play服务组件,并将该库添加到您的项目中。
- 将您的开发项目中的android
google-play-services_lib
的GooglePlayServices
库导入为Library项目。
你应该有一个实际的设备,因为这个API不能在模拟器中工作。
融合的位置提供智能管理的基本定位技术(GPS /无线网络/网络提供商的连接),使我们根据我们的需要的最佳位置。
为什么使用它
我们可以选择的位置提供商(网络或GPS),并要求位置更新的一个或设置接近警报。但是这种方法存在两个主要问题: 1.如果我们需要定义精确的位置,我们必须在网络和GPS位置提供商之间切换(因为GPS在室内不起作用)。 2.接近警报用于通知用户接近某个位置,这对电池寿命产生影响。
优势
- 简单的API:它让在美国的指定高一级的需要,而不必担心位置提供商,如“精度高”或“低功耗”。
- 电池使用效率:最大限度地降低了应用程序的用电量。根据所有传入的位置请求和可用传感器,融合位置提供商选择最有效的方式来满足这些需求。
步骤来使用该API:
声明位置相关的许可清单文件。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
或者
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
实现相关接口和回调。我们要求位置更新之前,我们必须首先实现的是位置服务使用连接状态传达给我们的应用程序接口:
com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks
:指定方法,当位置客户端连接或断开位置服务调用。
com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener
连接到谷歌播放服务,连接LocationClient
到谷歌API。要做到这一点,创建一个LocationClient
对象(的GoogleApiClient
实例)为:
mLocationClient = new GoogleApiClient.Builder(getApplicationContext())
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
然后调用mLocationClient.connect();
。
private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
检索内部onConnected(Bundle bundle)
当前位置:
Location currentLocation = fusedLocationProviderApi .getLastLocation(mLocationClient);
if (mCurrentLocation != null) {
Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() +
" - " + mCurrentLocation.getLongitude());
}
创建并设置一个LocationRequest
对象:
通过使用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);
}
要从位置服务获取定期位置更新,我们使用位置客户端发送请求。
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);
}
}
};
你有没有发现这个问题解决了吗? –