如果你的应用程序需要请求位置或可以得到位置更新通知的权限,设备需要启用相应的系统设置,如GPS或Wi-Fi扫描。 而不是直接使服务,如设备的GPS,你的应用程序指定精度/功耗和所需的更新间隔所需的水平,设备会自动对系统设置进行相应的更改。 这些设置定义在LocationRequest数据对象。
本课向您展示如何使用设置API来检查哪些设置已经开启,和现在用户的位置设置对话框提供了一个单一的方式去更新他们的设置。
连接到位置服务
为了使用由谷歌播放服务和混合的位置提供服务,请连接你的应用程序到Google API Client, ,然后检查当前的位置设置,并提示用户是否需要启用所需的设置。 有关使用Google API Client连接的详细信息,请看上一篇文章http://blog.csdn.net/bernie_shi/article/details/52367598。
使用位置服务必须请求位置信息访问权限的应用程序。 在这一课中,粗定位检测就足够了。 要求与本许可uses-permission元素应用清单,如下面的例子:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
设置一个位置请求
要存储参数要求融合位置提供者,创造LocationRequest 。 参数确定精度位置请求的级别。 对于所有可用的位置请求选项的详细信息,请参阅LocationRequest类引用。 本课程设置的更新间隔,更新最快的时间间隔和优先级,如下所述:
更新间隔
setInterval() -此方法设置以毫秒为单位在您的应用更愿意接收位置更新率。 注意该位置更新可能会比该速率更快,如果另一应用程式以更快的速度接收更新,或比这速率慢,或者有可能在所有的是(如果设备没有连接,例如)进行任何更新。
最快的更新间隔
setFastestInterval() -此方法设置在您的应用可以处理位置更新毫秒最快的速度。 您需要设置这样的速度,因为其他应用程序也影响到哪些更新的发送速率。 该谷歌Play服务位置API发送的任何应用程序已要求以最快的速度更新setInterval() 。 如果这个速度比你的应用程序可以处理更快,你可能会遇到UI闪烁或数据溢出问题。 为了防止这种情况,呼叫setFastestInterval()到上限设定为更新速率。
优先
setPriority()
-此方法设置请求的优先级,这给谷歌播放服务的位置服务的强烈暗示哪些位置信息源使用。 下面的值被支持:
PRIORITY_BALANCED_POWER_ACCURACY
-使用此设置要求定位精度为一个街区,这是约100米的精确度之内。 这被认为是准确的粗略水平,并有可能降低功耗。 使用此设置,位置服务都可能使用WiFi和手机信号塔定位。 但是请注意,该位置提供的选择取决于许多其它因素,如哪些源是可用的。
PRIORITY_HIGH_ACCURACY
-使用此设置要求最精确的位置成为可能。 使用此设置,位置服务都更有可能使用GPS来确定位置。
PRIORITY_LOW_POWER
-使用此设置要求城市级精度,这是约10公里的准确性。 这被认为是准确的粗略水平,并有可能降低功耗。
PRIORITY_NO_POWER
-如果你需要对功耗的影响可以忽略使用此设置,但希望可以当接收位置更新。 通过此设置,您的应用程序不会触发任何位置更新,但接收其他应用程序引发的位置。
创建位置请求并设置参数如图所示这个代码示例:
// Create an instance of GoogleAPIClient.
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
优先PRIORITY_HIGH_ACCURACY ,与组合ACCESS_FINE_LOCATION你已经在应用程序清单中定义权限设置,以及5000毫秒(5秒)快速更新间隔,使融合的位置提供给返回的准确度在几个位置更新脚。 这种方法适用于映射的应用程序,实时显示的位置。
性能提示:如果您的应用程序访问网络或接收位置更新后,会出现其他长期运行的工作,调整速度最快的间隔较慢值。 这种调整会防止你的应用程序接收它不能使用更新。 一旦长期运行的工作已经完成,创造了最快时间回到一个快速的价值。
获取当前位置设置
一旦你连接到谷歌播放服务和位置服务API,你可以得到一个用户设备的当前位置设置。 要做到这一点,创建一个LocationSettingsRequest.Builder ,并添加一个或多个位置的请求。 下面的代码片段展示了如何添加在上一步中创建的位置请求:
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
接下来检查当前位置设置是否满足
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mGoogleClient,
builder.build());
当PendingResult返回,您的应用程序可以通过查看从状态代码检查位置设置LocationSettingsResult对象。 若要获取有关的相关位置设置的当前状态的更多详细信息,您的应用程序可以调用LocationSettingsResult对象的getLocationSettingsStates()方法。
提示用户更改位置设置
为了确定位置设置是否适合该位置请求,检查的状态代码LocationSettingsResult对象。 状态代码RESOLUTION_REQUIRED表示设定必须改变。 要提示您是否允许修改的位置设置的用户,请拨打startResolutionForResult(Activity, int) 这种方法带来了一个对话框,要求用户修改位置设置权限。 下面的代码片段展示了如何检查位置设置,以及如何调用startResolutionForResult(Activity, int)
result.setResultCallback(new ResultCallback<LocationSettingsResult>()) {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
final LocationSettingsStates = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can
// initialize location requests here.
...
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(
OuterClass.this,
REQUEST_CHECK_SETTINGS);
} catch (SendIntentException e) {
// Ignore the error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way
// to fix the settings so we won't show the dialog.
...
break;
}
}
});