Android не может найти местоположение после перезагрузки телефона - PullRequest
3 голосов
/ 21 марта 2011

У меня проблема с получением местоположения пользователя на одном из телефонов моего тестера.Это всегда хорошо работает для меня, поэтому я не знаю, в чем разница.

Вот последовательность:

1: перезагрузка телефона.2. Проверяет, включены ли службы определения местоположения (как для GPS, так и для сети).3. Запускает мое приложение.

ОС никогда не предоставляет правильное местоположение.GetLastKnownLocation () всегда возвращает значение NULL как для GPS_PROVIDER, так и для NETWORK_PROVIDER, а LocationListener никогда не вызывается после requestLocatioUpdates.

  1. Затем он запускает приложение Google Maps (которое, похоже, находит его).
  2. Затем, если он снова запустит мое приложение и оно правильно определит местоположение.

Вот основные сведения о моем коде:

    LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE );
    LocationListener locationListener = new LocationListener()
    {

        public void onLocationChanged( Location location )
        {
            useLocation( location );
        }

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

        public void onProviderEnabled( String provider )
        {
        }

        public void onProviderDisabled( String provider )
        {
        }
    };

    // Register the listener with the Location Manager to receive location updates
    // Checks a minimum of every 120 seconds.  Location must change by 10000 meters 
    String provider = locationManager.getBestProvider( new Criteria(), true );
    if ( provider != null )
    {
        System.out.println( "Using provider: " + provider );
        locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );
    }

    // Get the last know location for immediate use
    Location lastLocation = locationManager.getLastKnownLocation( LocationManager.GPS_PROVIDER );
    if ( lastLocation != null )
        useLocation( lastLocation );
    else
        useLocation( locationManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER ) );

Когда это не удается, код говоритлучший провайдер - это "сеть", так что это то, что я использую.Но onLocationChanged никогда не вызывается.Я также никогда не получаю ненулевое значение от getLastKnowLocation ().

Есть ли еще какая-то магия, которую мне нужно сделать, чтобы это работало последовательно после перезагрузки?

Ответы [ 5 ]

1 голос
/ 25 марта 2014

Лучшее решение - не пытаться найти лучшего провайдера один раз (вы не можете быть уверены, что это будет GPS или сеть), но прислушиваться к как провайдерам GPS, так и сети и решать, какое местоположение использовать, исходя из их точности и поставщика:

locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, PERIOD_UPDATE_GPS*1000, DISTANCE_UPDATE_GPS, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, PERIOD_UPDATE_NETWORK*1000, DISTANCE_UPDATE_NETWORK, this);

В onLocationChange:

@Override
public void onLocationChanged(Location locationNew) {
    // for example, check if location was provided by GPS
    if (locationNew.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                // do your work here
    }
}
1 голос
/ 24 ноября 2011

Я предполагаю, что вы написали это в сервисе. В этом случае попробуйте использовать BroadCastReciever, который прослушивает загрузочные события. Например,

<receiver android:name="com.singulera.familysiren.receiver.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED">
        </action>
        <category android:name="android.intent.category.HOME">
        </category>
    </intent-filter>
</receiver>

Затем в файле BootReceiver позвоните в вашу службу.

0 голосов
/ 26 марта 2014

У меня была точно такая же проблема. Я забыл добавить разрешения для доступа к расположению / разрешениям ACCESS_COARSE_LOCATION и ACCESS_FINE_LOCATION в моем манифесте.

После добавления и перестройки он начал работать как положено.

0 голосов
/ 19 декабря 2012

У меня была та же проблема с Samsung Galaxy 3 и устройством Nexus, использующим GPS_PROVIDER, как только я начал использовать GPS и Ntwork. Он выбирает местоположение, которое будет возвращено первым, и показывает пользователям.Во-первых, указанная дистанция составляет 300 метров, а интервал времени - 10 секунд

.
0 голосов
/ 21 марта 2011

попробуйте изменить этот код

locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );

на

 locationManager.requestLocationUpdates( provider, 120 * 1000, 0, locationListener ); 

это может быть из-за того, что вы отказываетесь от 1000 метров

...