Поставщик плавного местоположения не получает местоположение, если GPS не включен
Итак, я внедрил новый API-интерфейс Fuse Location Provider, чтобы получить местоположение пользователя, но по какой-то причине я не могу получить какое-либо местоположение, если GPS не включен. Не всегда, у пользователей будет свой GPS, и я бы не стал просить их поворачивать свой GPS каждый раз при загрузке приложения.
Как я могу сказать API, чтобы дать мне местоположение с любым поставщиком, который у него есть?
Вот мой код:
public class FusedLocationService implements
LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
public interface OnLocationChangedListener {
public void OnLocationChanged(Location location);
}
private final String TAG = "SE8611";
private boolean mRequestingLocationUpdates = true;
private OnLocationChangedListener mCallBack;
Service locationService;
private LocationRequest locationRequest;
private GoogleApiClient googleApiClient;
private Location mCurrentLocation;
private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) {
Logger.log(TAG, "FusedLocationService called");
this.mCallBack = (OnLocationChangedListener)locationService;
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(INTERVAL);
locationRequest.setFastestInterval(FASTEST_INTERVAL);
this.locationService = locationService;
googleApiClient = new GoogleApiClient.Builder(locationService)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (googleApiClient != null) {
googleApiClient.connect();
}
}
@Override
public void onConnected(Bundle connectionHint) {
if(mRequestingLocationUpdates) {
startLocationUpdates();
}else{
Logger.log(TAG, "Location updates are already running.");
}
}
protected void startLocationUpdates() {
this.fusedLocationProviderApi.requestLocationUpdates(
googleApiClient, locationRequest, this);
this.mRequestingLocationUpdates = false;
}
@Override
public void onLocationChanged(Location mCurrentLocation) {
Logger.log(TAG, "onLocationChanged called");
this.mCurrentLocation = mCurrentLocation;
this.mCallBack.OnLocationChanged(this.mCurrentLocation);
}
public void startLocationUpdatesAfterResume(){
if (googleApiClient.isConnected() && !mRequestingLocationUpdates) {
Logger.log(TAG, "startLocationUpdatesAfterResume called");
this.startLocationUpdates();
}
}
public void stopLocationUpdates() {
Logger.log(TAG, "stopping Location Updates");
LocationServices.FusedLocationApi.removeLocationUpdates(
googleApiClient, this);
}
public Location getLocation() {
return this.mCurrentLocation;
}
@Override
public void onConnectionSuspended(int i) {
this.mRequestingLocationUpdates = true;
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
this.mRequestingLocationUpdates = true;
}
}
Ответы
Ответ 1
У меня была такая же проблема, как и вы, что совсем не проблема.
Android имел кнопку GPS, которая позволяла вам контролировать ее напрямую, но они заменили ее кнопкой "Расположение", которая работает по-разному.
Чтобы получить какое-либо местоположение, вы должны включить его.
Как и вы, я думал, что кнопка "Местоположение" включена и выключается только с GPS, но это не так.
Вы можете управлять GPS, изменив режим местоположения:
1. Высокая точность (GPS, Wi-Fi и мобильные сети)
2. Энергосбережение (Wi-Fi и мобильные сети)
3. Только GPS
Ответ 2
Я думаю, что нашел решение проблемы.
Если вы перейдете в Настройки → Конфиденциальность и безопасность → Местоположение, вы заметите, что Location - это не только GPS, но и позволяет пользователю решить, какие поставщики могут быть использованы. Например, вы можете установить, что для получения любых местоположений следует использовать только WiFi и Cellular.
Отключить параметр местоположения отключит сразу всех провайдеров, а не только GPS.
Чтобы проверить, что приложение для пользователей только с WiFi может получить местоположение - измените настройку на "Wifi + Cellular".
Ответ 3
вы, кажется, используете LocationRequest.PRIORITY_HIGH_ACCURACY
, который предпочитает использовать GPS выше и выше других методов. Вы можете использовать PRIORITY_BALANCED_POWER_ACCURACY
, который будет использовать WiFi и сотовые башни перед использованием GPS.
Кроме того, поскольку PRIORITY_BALANCED_POWER_ACCURACY
является "грубым" уровнем точности, вы можете соответствующим образом изменить разрешение на размещение в своем манифесте.
В учебной документации содержится подробная информация о флажках приоритета, вы также можете пройти через нее.