Android:我可以启用 GPS 而无需像 "google maps" 应用程序那样将用户重定向到设置屏幕吗
Android: Can I enable the GPS without redirecting the user to the settings screen like in "google maps" app
在基于 GPS 的应用程序中,用户启用其 GPS 非常重要。如果没有,那么我们通常会显示一个对话框,说明用户“应该从设置中启用他的 GPS 才能使用此功能”。
当用户按下“确定”时,他将被重定向到“设置”页面,我不喜欢这个解决方案,因为它让用户脱离应用程序上下文进入设置。
我注意到 "google maps" 应用程序有一个更好的解决方案,即在需要 GPS 功能时显示一个简洁的对话框。根据用户的选择 "OK" GPS 将 直接 启用,无需任何重定向到设置。
我可以启用 GPS 而无需像 "google maps" 应用程序那样将用户重定向到设置屏幕吗?
查看下图:
要获得该功能,您需要:
- 首先(至少)7.0 版本的播放服务
compile 'com.google.android.gms:play-services-location:16.0.0'
- 你的代码中的第二个类似的东西(我在我的 onCreate 中有它):
-
// Check the location settings of the user and create the callback to react to the different possibilities
LocationSettingsRequest.Builder locationSettingsRequestBuilder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, locationSettingsRequestBuilder.build());
result.setResultCallback(mResultCallbackFromSettings);
然后创建回调:
// The callback for the management of the user settings regarding location
private ResultCallback<LocationSettingsResult> mResultCallbackFromSettings = new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
//final LocationSettingsStates 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 could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(
MapActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e(TAG, "Settings change unavailable. We have no way to fix the settings so we won't show the dialog.");
break;
}
}
};
然后,最后,在 onActivityResult
我有以下内容:
/**
* Used to check the result of the check of the user location settings
*
* @param requestCode code of the request made
* @param resultCode code of the result of that request
* @param intent intent with further information
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
//final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
switch (requestCode) {
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
if (mGoogleApiClient.isConnected() && userMarker == null) {
startLocationUpdates();
}
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
break;
default:
break;
}
break;
}
}
在基于 GPS 的应用程序中,用户启用其 GPS 非常重要。如果没有,那么我们通常会显示一个对话框,说明用户“应该从设置中启用他的 GPS 才能使用此功能”。
当用户按下“确定”时,他将被重定向到“设置”页面,我不喜欢这个解决方案,因为它让用户脱离应用程序上下文进入设置。
我注意到 "google maps" 应用程序有一个更好的解决方案,即在需要 GPS 功能时显示一个简洁的对话框。根据用户的选择 "OK" GPS 将 直接 启用,无需任何重定向到设置。
我可以启用 GPS 而无需像 "google maps" 应用程序那样将用户重定向到设置屏幕吗?
查看下图:
要获得该功能,您需要:
- 首先(至少)7.0 版本的播放服务
compile 'com.google.android.gms:play-services-location:16.0.0'
- 你的代码中的第二个类似的东西(我在我的 onCreate 中有它):
-
// Check the location settings of the user and create the callback to react to the different possibilities
LocationSettingsRequest.Builder locationSettingsRequestBuilder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, locationSettingsRequestBuilder.build());
result.setResultCallback(mResultCallbackFromSettings);
然后创建回调:
// The callback for the management of the user settings regarding location
private ResultCallback<LocationSettingsResult> mResultCallbackFromSettings = new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
//final LocationSettingsStates 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 could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(
MapActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e(TAG, "Settings change unavailable. We have no way to fix the settings so we won't show the dialog.");
break;
}
}
};
然后,最后,在 onActivityResult
我有以下内容:
/**
* Used to check the result of the check of the user location settings
*
* @param requestCode code of the request made
* @param resultCode code of the result of that request
* @param intent intent with further information
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
//final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
switch (requestCode) {
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
if (mGoogleApiClient.isConnected() && userMarker == null) {
startLocationUpdates();
}
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
break;
default:
break;
}
break;
}
}