Это связано не с тем, что GPS-устройство, но Location Settings
еще не включено в устройстве, оно находится под вашим устройством «Настройки»> «Google»> «Службы»> «Местоположение» или «Настройки»> «Конфиденциальность и безопасность»> «Местоположение» или «Настройки»> «Местоположение». Я запутался, потому что на каком-то устройстве в строке состояния выпадающего меню отображается кнопка включения GPS, а в некоторых случаях отображается кнопка «Разрешение местоположения». Существует способ автоматического включения настроек местоположения (без навигации пользователя к настройкам устройства), он решил мою проблему, надеюсь, что это поможет вам:
После подключения GoogleApiClient выполните проверку настроек местоположения, как показано ниже:
public static GoogleApiClient mGoogleApiClient;
private static PendingResult<LocationSettingsResult> result;
private static LocationSettingsRequest.Builder builder;
public static Location mLastLocation;
public static boolean isLocationON = false;
public static synchronized void buildGoogleApiClient(Activity a, Context c) {
try {
mActivity = a;
mContext = c;
mGoogleApiClient = new GoogleApiClient.Builder(c)
.addConnectionCallbacks(ccb)
.addOnConnectionFailedListener(odfl)
.addApi(LocationServices.API)
.build();
builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
mGoogleApiClient.connect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle arg0) {
checkLocationSettings();
}
@Override
public void onConnectionSuspended(int arg0) {
}
};
private static void checkLocationSettings() {
result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
isLocationON = true;
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLocationSettingsListener != null) {
mLocationSettingsListener.onLocationON();
}
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
isLocationON = false;
try {
// This line will check the result and prompt a dialog if the device location settings is not enabled
status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
isLocationON = false;
// Location settings are unavailable so not possible to show any dialog now
if (mLocationSettingsListener != null) {
mLocationSettingsListener.onLocationError();
}
break;
}
}
});
}