Объект местоположения Android всегда равен нулю

Я просто пытаюсь написать метод, который возвращает широту и долготу. У меня есть активность с кнопкой и двумя текстовыми полями. Класс Java, который я использую, расширяет AppCompatActivity и реализует LocationListener. Когда кнопка нажата, нажимается следующий метод:

public void startGPS(View view)
{

        // Here is the code to handle permissions - you should not need to edit this.
        if ( Build.VERSION.SDK_INT >= 23 &&
                ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[] { android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION }, TAKE_PHOTO_PERMISSION);
        }

        Location location = locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, this);
}

Позже я пытаюсь распечатать свое местоположение в моем методе onLocationChanged, но это приводит к сбою приложения. Я прогнал его через отладчик и обнаружил, что местоположение всегда было null.

Я попытался использовать это решение, но оно не сработало. Другие примеры вызывают функцию в onResume, но мне действительно нужно, чтобы это было в методе startGPS.

Кроме того, есть ли шанс, что ошибка только с моим устройством? Я запускаю его на Nexus 7, у которого, похоже, нет никаких проблем при запуске Google Maps.


person Natasha Alexandrov    schedule 26.03.2017    source источник
comment
stackoverflow.com/a/43016257/5993410   -  person ATEF    schedule 27.03.2017
comment
@AtefHares Да, я уже добавил их в свой манифест.   -  person Natasha Alexandrov    schedule 27.03.2017


Ответы (3)


Если вы пытаетесь вернуть координаты GPS после нажатия кнопки, скорее всего, у вас еще нет сохраненного местоположения GPS. Вы должны использовать requestLocationUpdates, а не getLastKnownLocation.

locationManager.requestLocationUpdate(LocationManager.NETWORK_PROVIDER, 5000, 0, locationListener)

Когда вы используете requestLocationUpdate, он автоматически вызывает onLocationChanged для вас, поэтому вам не нужно вызывать его в своем коде.

Вы можете заменить LocationManager.NETWORK_PROVIDER на LocationManager.GPS_PROVIDER, но пока у вас есть подключение к WiFi, вы сможете получить координаты.

person Salah Assana    schedule 26.03.2017

Если вы пытаетесь использовать это внутри, попробуйте переключить GPS_PROVIDER на NETWORK_PROVIDER; это будет работать везде, где телефон обслуживается.

person RoniS8675309    schedule 27.06.2018

Потому что Android не отслеживает местоположение, когда его не запрашивает ни одно приложение, чтобы сэкономить заряд батареи. GetLastKnownLocation почти всегда возвращает значение null. Если вам нужен гарантированный ненулевой ответ, используйте requestLocationUpdates или requestSingleLocation. Однако оба они являются асинхронными, поэтому они будут вызывать обратный вызов, когда местоположение будет найдено (на самом деле определение местоположения может занять от нескольких секунд до минуты или двух, в зависимости от типа провайдера местоположения, атмосферных условий, прямой видимости проблемы и т. д. Если использовать GPS и внутри, это может никогда не произойти.)

person Gabe Sechan    schedule 26.03.2017
comment
Я никогда не видел этого раньше. Я пытался изменить его на Location location = locationManager.requestLocationUpdates("gps", 5000, 0, locationListener), но Android Studios нарисовала под ним линию выполнения и написала Incompatible types - person Natasha Alexandrov; 27.03.2017
comment
Немедленно возвращаемое значение не поможет. Это тот, который вы получаете, когда вызывается обратный вызов прослушивателя местоположения, который гарантирует ненулевое значение, потому что функции requestXXX фактически включают отслеживание. getLastKnownLocation можно проверить и использовать в качестве оптимизации, но на него не следует полагаться, и определенно не следует использовать для проверки того, меняется ли их местоположение. - person Gabe Sechan; 27.03.2017
comment
Извините, я не понимаю, что не так с моей реализацией? Что мне следует изменить? - person Natasha Alexandrov; 27.03.2017
comment
Первый параметр должен быть LocationManager.GPS_PROVIDER. Он не возвращает значение — locationListener позже будет вызываться со значением, когда оно будет готово. - person Gabe Sechan; 27.03.2017
comment
Поэтому я не должен приравнивать его ни к чему. Однако теперь, когда я это сделал, мое приложение просто падает, и в журнал ничего не печатается. Последнее сообщение перед закрытием приложения было Connected to process 5726 on device asus-nexus_7-06df827f - person Natasha Alexandrov; 27.03.2017