Usługi Google Play dla Androida. Klient lokalizacji nie aktualizuje lokalizacji, jeśli WIFI jest wyłączone

Nasza aplikacja żąda aktualizacji lokalizacji za pomocą LocationClient i IntentService. Lokalizacja nie aktualizuje się w ogóle, jeśli użytkownik wyłączy wifi w ustawieniach telefonu.

Próbowaliśmy przetestować aplikację z PRIORITY_HIGH_ACCURACY i aktualizacjami lokalizacji, Gdy wifi jest wyłączone.

Ten sam problem, jeśli użytkownik porusza się w miejscu, w którym nie ma Sieci wifi.

Myślę, że poprawnym zachowaniem jest użycie innych czujników telefonu (takich jak GPS) do aktualizacji lokalizacji, jeśli telefon nie może zaktualizować lokalizacji za pomocą wifi.

Kroki do "reproduction": {]}

  1. Uruchom aktualizację lokalizacji z intencją oczekującą. Z parametrami

    LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setInterval(5 * 60 * 1000)
            .setFastestInterval(60*1000)
            .setSmallestDisplacement(70);
    
  2. Wyłącz wifi w ustawieniach telefonu lub idź z telefonem w kraju, w którym nie ma Sieci wifi.

Testowane na Androidzie 4.4, 4.3, 4.1, 4.0, 2.3.3. (Nexus7, Nexus4, Samsung GS2, HTC Wildfire i inne)

public class TrackerService extends IntentService {
    private void startUpdateLocation() {
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(),
            0, new Intent(ACTION_LOCATION_UPDATED), 0);
        LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setInterval(5 * 60 * 1000)
            .setFastestInterval(60*1000)
            .setSmallestDisplacement(70);

        getLocationClient().requestLocationUpdates(request, pendingIntent);
        Log.d(Utils.getMethodName(), "Location update started");
    }

    private LocationClient getLocationClient() {
        if (mLocationClient != null && mLocationClient.isConnected()) return mLocationClient;
        mLocationClient = new LocationClient(this,
            new GooglePlayServicesClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    Log.d(Utils.getMethodName(), "Location client. Connected");
                }

                @Override
                public void onDisconnected() {
                    Log.d(Utils.getMethodName(), "Location client. Disconnected");
                }
            },
            new GooglePlayServicesClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult connectionResult) {
                    throw new IllegalStateException("Failed connection to location manager " + connectionResult.toString());
                }
            }
        );
        mLocationClient.connect();
        try {
            while (mLocationClient.isConnecting()) {
                Thread.sleep(200);
            }
        } catch (InterruptedException e) {
            throw new IllegalStateException("Thread interrupted", e);
        }
        return mLocationClient;
    }
}

Próbowałem wysłać raport o błędzie https://code.google.com/p/android/issues/detail?id=63110

Twórcy Androida nie mogą pomocy.

Gdzie mogę zgłaszać błędy w usługach Google Play?

Czy to błąd w usługach Google Play?

Jaką pracę możesz zaoferować?

Nie chcemy używać PRIORITY_HIGH_ACCURACY, ponieważ wyczerpuje baterię telefonu. Nasza aplikacja śledzi lokalizację telefonu i nie powinna zależeć od ustawień wifi i dostępności sieci wifi.

Author: Kara, 2013-12-02

3 answers

Znalazłem rozwiązanie.

Google zmieniło dokumentację dla Klienta lokalizacji. Teraz jest napisane:

Public static final INT PRIORITY_BALANCED_POWER_ACCURACY

Używany z setPriority (int) do żądania dokładności poziomu "block".

Dokładność poziomu bloku jest uważana za dokładność około 100 metrów. Użycie takiej dokładności często zużywa mniej energii.

Używając grubej dokładności - myślę, że oznacza to, że Klient lokalizacji nie używa GPS do aktualizacji lokalizacji, jeśli priorytetem jest PRIORITY_BALANCED_POWER_ACCURACY.

Więc do korzystania z GPS należy użyć PRIORITY_HIGH_ACCURACY.

 10
Author: asivura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 10:10:22

Pozwól, że dam ci jedną odpowiedź na to pytanie. Jeszcze kilka minut temu miałem ten sam problem i miałem nadzieję, że znajdzie się tu odpowiedź.

Opiszę mój problem i rozwiązanie:

Problem: Nie dostałem żadnych aktualizacji lokalizacji bez połączenia z Internetem podczas korzystania z usług Google Play LocationClient. GPS włączony.

Mój kod był stabilny i działał z Internetem, ale testy polowe zawiodły.

Możliwe przyczyny źródłowe: 1) LocationClient sucked 2) klient lokalizacji nie otrzymał żadnych aktualizacji gps

Rozwiązanie: Aby to przetestować, próbowałem użyć aplikacji Google maps. Narzekał bez połączenia z Internetem, więc dałem mu jeden. Potem próbowałem się zlokalizować, ale pojawił się nowy ekran z informacją, że muszę zezwolić "google apps" na dostęp do mojej lokalizacji. Powiedział, że nie wpłynie to na aplikacje innych firm nie z google, co okazało się kompletną bzdurą. Kiedy włączyłem "tylko google apps", aby uzyskać dostęp do mojej lokalizacji, nagle moja własna aplikacja uruchomiony w ciągu kilku sekund. Rozwój dla Androida był pełen tych "momentów Google".

 6
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 12:49:58

Jeśli ktoś wciąż się zastanawia,

Dokumentacja Google mówi:

Jeśli używasz zarówno NETWORK_PROVIDER, jak i GPS_PROVIDER, musisz zażądać tylko uprawnienia ACCESS_FINE_LOCATION, ponieważ obejmuje ono uprawnienia dla obu dostawców. Uprawnienia ACCESS_COARSE_LOCATION pozwalają na dostęp tylko do NETWORK_PROVIDER.

 0
Author: ShahrozKhan91,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-17 11:57:46