emm*_*mby 10 android location geolocation google-play
假设我的应用程序中有5个不同的活动,希望用它们LocationClient.getLastLocation()来获取最后的已知位置.这看起来很简单.
理想情况下,我只想在每个活动中创建一个LocationClient并调用getLastLocation().然而,有一些额外的工作,一个人做连接到谷歌播放服务,如呼叫LocationClient.connect()和处理onConnected,onDisconnected以及onConnectionFailed回调.文档在这里:https://developer.android.com/training/location/retrieve-current.html
据我所知,我的五个不同活动中的每一个都必须处理LocationClient的生命周期方法.他们也不能立即打电话getLastLocation(),onCreate()因为该活动的联系可能尚未建立.
是否有一种简单的方法来简化LocationClient的生命周期,以便getLastLocation()在我为我的应用程序建立一次连接后立即在任何新活动中工作?
我使用融合位置提供程序API来定期更新位置.我已经在后台服务中实现了它(例如LocationUpdateService extends Service).之前我使用的是Android Location框架API,但它对电池使用效果不佳.融合位置提供程序API是有效使用电池的最佳选择.
我还准备了实施它所需的步骤说明(以及其他有用的信息).简单来说,这是目前在Android平台上获取位置数据的最佳方式.Google Play服务提供了许多位置API来获取位置数据(例如,用户的当前位置,或者您可以说设备的最后已知位置).
融合位置提供商是Google Play服务中的位置API之一. 这些是先决条件:
Google Play服务SDK用作库项目(并且Google PlayService也已正确安装在您的设备中).
GooglePlayServices从google-play-services_lib您的开发项目中的android 导入库作为Library项目.您应该拥有一个实际的设备,因为此API在模拟器中不起作用.
融合位置提供商智能地管理底层定位技术(GPS/Wi-Fi /网络提供商的连接),并根据我们的需求为我们提供最佳位置.
我们可以选择其中一个位置提供商(网络或GPS)并请求位置更新或设置接近警报.但这种方法存在两个主要问题:1.如果我们需要定义精确位置,我们必须在网络和GPS位置提供商之间切换(因为GPS不能在室内工作).2.接近警报用于通知用户某个位置的接近程度,这对电池寿命造成了影响.
使用此API的步骤:
在清单文件中声明与位置相关的权限.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)
要么
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)实现相关的接口和回调.在我们请求位置更新之前,我们必须首先实现位置服务用于向我们的应用程序传达连接状态的接口:
com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks:指定位置客户端连接或断开连接时Location Services调用的方法.com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener连接到Google Play服务,连接LocationClient到Google API.为此,请创建一个LocationClient对象(实例GoogleApiClient):
mLocationClient = new GoogleApiClient.Builder(getApplicationContext())
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
Run Code Online (Sandbox Code Playgroud)
然后打电话mLocationClient.connect();.
FusedLocationProviderApi使用LocationServices类创建实例:
private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
Run Code Online (Sandbox Code Playgroud)检索里面的当前位置onConnected(Bundle bundle):
Location currentLocation = fusedLocationProviderApi .getLastLocation(mLocationClient);
if (mCurrentLocation != null) {
Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() +
" - " + mCurrentLocation.getLongitude());
}
Run Code Online (Sandbox Code Playgroud)创建和设置LocationRequest对象:
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);
}
Run Code Online (Sandbox Code Playgroud)要从位置服务获取定期位置更新,我们使用位置客户端发送请求.
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);
}
}
};
Run Code Online (Sandbox Code Playgroud)