Как получить текущее точное местоположение в Android без подключения к интернету?
Я хочу получить текущие точные координаты местоположения в Android. Я могу получить местоположение, если мобильное устройство подключено к интернет-соединению Wifi, но в другом случае, когда я иду куда-то еще и интернет-соединение недоступно, тогда оно не дает координаты текущего местоположения. вместо этого давая последние координаты местоположения.
Например:
В настоящее время я нахожусь в городе А и получаю текущие координаты через соединение Wi-Fi и перехожу в город Б, тогда я не могу получить текущие координаты. Вместо этого он дает последние координаты местоположения.
Может ли кто-нибудь предложить мне, как я могу получить текущее местоположение без подключения к интернету.
public Location getLocation() {
try {
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GetLocations.this);
}
}
/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
return longitude;
}
2 ответа
Код, который вы показываете, это просто getLocation
метод вашего класса. Предположительно, ваш класс также реализует LocationListener
, правильный? (Предполагая, что он не видит, потому что вы назначаете "это" в requestLocationUpdates
как слушатель.)
Метод, который вы показали, только когда-либо возвращает местоположение ПОСЛЕДНЕЕ ИЗВЕСТНОЕ, потому что обновления местоположения через провайдеров являются асинхронными. Вы указываете, что хотите получить информацию о местонахождении путем регистрации прослушивателя и что прослушиватель периодически получает обновления (в зависимости от заданных вами настроек и исходя из реальных возможностей устройства и обстоятельств). Вы НЕ получите обратно местоположение сразу после регистрации.
В случае вашего вопроса, для получения информации о местонахождении, НЕ подключенной к сети, вам нужно будет использовать провайдера GPS (он работает, когда не подключен к сети передачи данных). Как только вы зарегистрируете приемник GPS-провайдера (как у вас уже есть), вы получите обновления местоположения посредством обратного вызова в приемнике, onLocationChanged(Location location)
,
Что делает твой onLocationChanged
обратный звонок делать?
Именно здесь вы получите обновленную информацию о местоположении через несколько секунд или минут после регистрации провайдера GPS (как скоро зависит от аппаратного обеспечения устройства, которое вы используете, и от условий окружающей среды, GPS использует несколько спутников и работает быстрее с четким вид на небо, он может не работать вообще, если вы находитесь в помещении или сигнал иным образом затруднен).
В дополнение к ожиданию получения от слушателя обновленной информации о местоположении, вы также можете рассмотреть возможность использования более простых, отдельных методов, чтобы получить последнее известное местоположение и зарегистрироваться для получения лучшего поставщика. Вы можете использовать несколько простых циклов и Criteria
Вы заинтересованы (COARSE против FINE, LOW_POWER или нет и т. д.).
Разработчики Android хорошо описали это в документации, а также в примере приложения с открытым исходным кодом "Protips for Location" и в блоге "Deep Dive" (в котором есть ссылки на все остальные ресурсы): http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html.
Без Интернета и GPS вы можете получить местоположение на основе GSM (сотовая сеть).
NETWORK_PROVIDER будет разрешать по GSM или Wi-Fi, которые когда-либо доступны. Очевидно, что при выключенном Wi-Fi будет использоваться GSM. Однако точность сотовой сети может варьироваться от 500 м до 2000 м.