Подтвердить что ты не робот

Службы Google Play для Android. Клиент местоположения не обновляет местоположение, если Wi-Fi отключен

Наше приложение для обновления запроса приложения с помощью LocationClient и IntentService. Местоположение не обновляется вообще, если пользователь отключает Wi-Fi в настройках телефона.

Мы пытались протестировать приложение с PRIORITY_HIGH_ACCURACY и обновлениями местоположения при отключении Wi-Fi.

Такая же проблема, если пользователь перемещается в том месте, где нет доступных сетей Wi-Fi.

Я думаю, что правильное поведение - использование других датчиков телефона (например, GPS) для местоположения обновления, если телефон не может обновить местоположение с помощью Wi-Fi.

Шаги для воспроизведения:

  • Запустите местоположение обновления с ожидающим намерением. С параметрами

    LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setInterval(5 * 60 * 1000)
            .setFastestInterval(60*1000)
            .setSmallestDisplacement(70);
    
  • Отключите Wi-Fi в настройках телефона или перейдите по телефону в стране, где нет доступных Wi-Fi сетей.

Протестировано на Android 4.4, 4.3, 4.1, 4.0, 2.3.3. (Nexus7, Nexus4, Samsung GS2, HTC Wildfire и др.)

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;
    }
}

Я попытался отправить отчет об ошибке https://code.google.com/p/android/issues/detail?id=63110

Разработчики Android не могут помочь.

Где я могу сообщить об ошибках в службах Google Play?

Является ли это ошибкой в ​​сервисах Google Play?

Что вы можете предложить?

Мы не хотим использовать PRIORITY_HIGH_ACCURACY, потому что он разряжает аккумулятор телефона. Наше приложение отслеживает местоположение телефона, и оно не должно зависеть от настроек Wi-Fi и доступности Wi-Fi сетей.

4b9b3361

Ответ 1

Я нашел решение.

Google изменила документацию для локального клиента. Теперь он говорит:

public static final int PRIORITY_BALANCED_POWER_ACCURACY

Используется с setPriority (int) для запроса точности уровня блока.

Точность уровня блока считается равной 100-метровой точности. Использование грубой точности, такой как это, часто потребляет меньше энергии.

Используя грубую точность - я думаю, это означает, что Location Client не использует GPS для местоположения обновления, если приоритет PRIORITY_BALANCED_POWER_ACCURACY.

Итак, для использования GPS вы должны использовать PRIORITY_HIGH_ACCURACY.

Ответ 2

Позвольте мне попытаться дать вам один ответ на этот вопрос. До нескольких минут назад у меня была такая же проблема, и я надеялся, что здесь будет ответ.

Я опишу свою проблему и решение:

Проблема: Я не получал никаких обновлений местоположения без подключения к Интернету при использовании сервисов GoogleClick LocationClient. GPS включен.

Мой код был стабильным и работал с Интернетом, но полевые тесты не удались.

Возможные причины: 1) LocationClient sucked 2) клиент местоположения не получил никаких обновлений gps

Решение: Чтобы проверить это, я попытался использовать приложение Google Maps. Он жаловался без подключения к интернету, поэтому я его дал. Затем я попытался найти себя, но появился новый экран, в котором говорилось, что мне нужно разрешить "приложения Google" получать доступ к моему местоположению. Он сказал, что это не повлияет на сторонние приложения, а не на google, что оказалось полной ерундой. Когда я включил "только приложения Google", чтобы получить доступ к моему местоположению, мое собственное приложение внезапно вступило в действие в течение нескольких секунд. Разработка для android была полна этих "моментов Google".

Ответ 3

Если кому-то все еще интересно,

Документация Google гласит:

Если вы используете как NETWORK_PROVIDER, так и GPS_PROVIDER, вам необходимо запросить только разрешение ACCESS_FINE_LOCATION, поскольку оно включает разрешение для обоих поставщиков. Разрешение для ACCESS_COARSE_LOCATION позволяет получить доступ только к NETWORK_PROVIDER.