Поставщик плавного местоположения не получает местоположение, если GPS не включен - программирование

Поставщик плавного местоположения не получает местоположение, если 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;
    }
}
4b9b3361

Ответ 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 является "грубым" уровнем точности, вы можете соответствующим образом изменить разрешение на размещение в своем манифесте.

В учебной документации содержится подробная информация о флажках приоритета, вы также можете пройти через нее.