Выбор местоположения GPS никогда не останавливается на ICS - PullRequest
4 голосов
/ 07 февраля 2012

Я пытаюсь выполнить двухэтапное определение местоположения с помощью моего LocationListener. Он работает, как и ожидалось, на каждой версии Android, как и ожидалось. Только на ICS я не могу остановить определение местоположения GPS.

// inner class inside my PoiActivity
private class CustomLocationListener implements LocationListener {
    String currentProvider = LocationManager.NETWORK_PROVIDER;

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            if (currentProvider.equals(LocationManager.NETWORK_PROVIDER)) {
                System.out.println(this);
                mLastKnownLocation = location;
                mHandler.sendEmptyMessage(0);
                mLocationManager.removeUpdates(this);
                Log.i("CustomLocationListener", "Got a rough location, removing the network listener ");
                Toast.makeText(PoiActivity.this, "Network found and removed", Toast.LENGTH_LONG).show();
                mLocationManager
                        .requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, Constants.LOCATION_MAX_ACCURACY, this);
                currentProvider = LocationManager.GPS_PROVIDER;
            } else if (location.getAccuracy() < Constants.LOCATION_MAX_ACCURACY
                       && currentProvider.equals(LocationManager.GPS_PROVIDER)) {
                System.out.println(this);
                mLastKnownLocation = location;
                mHandler.sendEmptyMessage(0);
                mLocationManager.removeUpdates(this);
                Log.i("CustomLocationListener", "Got a rough location, removing the gps listener ");
                Toast.makeText(PoiActivity.this, "GPS found and removed", Toast.LENGTH_LONG).show();
            }
        }
    }

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}

На основе информации Toast и LogCat слушатель удаляется, и на каждой версии, кроме ICS, я вижу, что значок GPS исчезает. На ICS значок появляется через пару секунд, но я никогда не получал тосты более одного раза, поэтому мой слушатель успешно удален.

Уничтожение приложения с помощью диспетчера задач или с помощью информации о приложении не останавливает отображение значка GPS снова и снова.

Я полагаю, что это конкретная проблема ICS, но я не могу найти отчет об ошибке для этого или аналогичного описания проблемы.

У кого-нибудь есть обходной путь? Потому что я не хочу, чтобы у пользователя возникало ощущение, что я несколько раз вытащил его и потреблял батарею без какой-либо выгоды ...

1 Ответ

0 голосов
/ 07 февраля 2012

Я видел несколько источников (ни один из них не является окончательным), которые намекают на то, что состояние значка может не отражать состояние чипа GPS. Чтобы выяснить, действительно ли работает GPS, вы можете написать тестовое приложение, которое использует только PASSIVE_PROVIDER и запускает тост или отправляет местоположение в текстовое поле, в котором указывается местоположение, если источником является GPS.

Хотя значок моего телефона, кажется, ведет себя сам, я написал тестовое «грязное приложение», которое удаляет только обновления местоположения в onDestroy, но не в onPause. Поэтому, когда я запускаю это приложение и нажимаю «домой», он переходит в фоновый режим, но оставляет GPS включенным. Если я затем запускаю приложение пассивного провайдера, то оно получает обновления местоположения.

Вы могли бы сделать нечто подобное, чтобы успокоить свой ум (или иным образом).

...