案例应用程序需要设备位置来指定Web请求。如果位置提供程序已禁用,则应使用上一个已知位置。作为android.location
seems to be deprecated in favor of Fused location API,我决定使用新的API,但遇到了一些问题。使用旧API我的情况如下:
//get Location
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
...
bestProvider = locationManager.getBestProvider(criteria, true);
protected void onResume() {
super.onResume();
//check providers. If providers disabled, use last known location
if (locationManager.isProviderEnabled(bestProvider)) {
locationManager.requestLocationUpdates(bestProvider, 1000 * 60, 100, this);
} else {
Location location = locationManager.getLastKnownLocation(bestProvider);
}
但我不确定如何在Fused API中进行类似的操作。提供商的可用性如何在新API中查找?因为融合位置的新接口(GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
)没有给我提示。
我想要了解的是我的帖子中描述的用例。 如果位置提供程序已禁用,则应使用上一个已知位置。因此,此类情况下核心位置API中的条件语句是isProviderEnabled()
方法的结果。但是新API怎么样?
答案 0 :(得分:2)
首先,不推荐使用LocationManager。但它直接使用Android API。 Google融合位置依赖于Google API(不是Android API,这意味着并非所有手机都默认拥有它)。
在Google API中,您不必担心要使用哪个提供商。但您所需要的只是连接到API,注册回调,发送请求等等。
https://developer.android.com/training/location/receive-location-updates.html
来自多个Google Developer文档:
这将放在您的app build.gradle
中apply plugin: 'com.android.application'
...
dependencies {
compile 'com.google.android.gms:play-services-location:9.0.0'
}
在你的活动中,应该放置
这样的东西 mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build()
mGoogleApiClient必须声明为GoogleApiClient GoogleApiClient mGoogleApiClient;
当然,此活动必须实现GoogleApiClient.ConnectionCallbacks,它有两个函数onConnected和onConnectionSuspended。
还实现GoogleApiClient.OnConnectionFailedListener。它有一个函数OnConnectionFailed
在OnConnectionFailed中,处理失败(例如,AlertDialog表示与Google API服务有关的错误)
在OnConnection中,您可以放置类似这样的内容
LocationRequest mLocationRequest = new LocationRequest().setInterval(1000 * 60);
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
请注意,活动必须实现com.google.android.gms.location.LocationListener
这是一种方式,另一种方法是使用PendingIntent与BroadcastReceiver绑定(性能更高但侦听器方法可以正常)