Intereting Posts
Иммерсивный полноэкранный режим ниже 4.4 Сервер adb устарел. Убийство … не может связывать 'tcp: 5037' Сервер ADB не ACK * не смог запустить демон * в ubuntu 14.04 LTS Android – это onDestroy, который должен уничтожить активность, свои переменные и освободить память Фрагмент onCreateView и onActivityCreated вызывается дважды Множественный шрифт Не работает вовремя в приложении Как обеспечить, чтобы приложения Android phonegap / cordova использовали веб-обзоры Chrome? Изменить расширяемый индикатор в ExpandableListView Как прекратить отображение сообщения из Toast, когда приложение закрыто? Как добавить элементы на счетчик динамически в android? ANT для Android Proguard obfuscation О «init: untracked pid xxxx exited» в Genymotion Android – использование пользовательского вида в виджетах Как показать активность как всплывающее окно другой активности? Как эмулятор android может связаться с машиной-разработчиком хоста в eclipse? Как протестировать возможности напоминания о мобильном приложении в эмуляторе?

Быстро получить текущее местоположение и один раз в android

У меня есть приложение для Android, которому требуется текущее местоположение устройства (широта и долгота). Я пробовал некоторый учебник в сети и особенно некоторые решения из переполнения стека, но они не работают хорошо для меня. Мое требование настолько простое: сначала мне нужно, чтобы оно было быстрым и нужно место, когда я начинаю фрагмент. Во-вторых, мне нужно, чтобы он был как можно более точным, я имею в виду, что он должен сначала использовать GPS, если GPS недоступен, а затем использовать Network provider.

Например, я пробовал это решение, но он возвращал значение null через 30 секунд, но я знаю, что есть все, что хорошо, потому что карта google и другое приложение хорошо работают !!!

Что-то, о чем говорят почти все ответы, это использовать getLastKnownLocation (), но я полагаю, что это не текущее, и я не хочу этого, если это так.

Может ли кто-нибудь предложить мне какой-то простой и быстрый способ получить место только один раз?!

заранее спасибо

Solutions Collecting From Web of "Быстро получить текущее местоположение и один раз в android"

Здесь вы можете использовать это …

Пример использования:

public void foo(Context context) { // when you need location // if inside activity context = this; SingleShotLocationProvider.requestSingleUpdate(context, new SingleShotLocationProvider.LocationCallback() { @Override public void onNewLocationAvailable(GPSCoordinates location) { Log.d("Location", "my location is " + location.toString()); } }); } 

Вы можете проверить, что lat / long – это фактические значения, а не 0 или что-то еще. Если я правильно помню, это не должно бросать NPE, но вы можете проверить это.

 public class SingleShotLocationProvider { public static interface LocationCallback { public void onNewLocationAvailable(GPSCoordinates location); } // calls back to calling thread, note this is for low grain: if you want higher precision, swap the // contents of the else and if. Also be sure to check gps permission/settings are allowed. // call usually takes <10ms public static void requestSingleUpdate(final Context context, final LocationCallback callback) { final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (isNetworkEnabled) { Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); locationManager.requestSingleUpdate(criteria, new LocationListener() { @Override public void onLocationChanged(Location location) { callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }, null); } else { boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (isGPSEnabled) { Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); locationManager.requestSingleUpdate(criteria, new LocationListener() { @Override public void onLocationChanged(Location location) { callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }, null); } } } // consider returning Location instead of this dummy wrapper class public static class GPSCoordinates { public float longitude = -1; public float latitude = -1; public GPSCoordinates(float theLatitude, float theLongitude) { longitude = theLongitude; latitude = theLatitude; } public GPSCoordinates(double theLatitude, double theLongitude) { longitude = (float) theLongitude; latitude = (float) theLatitude; } } } 

То, что вы хотите сделать, достигается с помощью LocationManager#requestSingleUpdate . Этот метод присоединяет слушателя в заданном петлителе (если вы хотите его или его хотите) и уведомляет местоположение ASAP, которое оно получено, только один раз. Метод, который вы предлагаете, используется только как неточное положение до того, как вам будет дан реальный.

В любом случае это будет быстро, чем миллисекунды (если вам не посчастливилось начать слушать, когда на устройство поступило местоположение). Подумайте о GPS как о элементе, который вы активируете при ожидании местоположений и отключите, когда вы удалите это прослушивание. Такое поведение выполняется, чтобы не разряжать аккумулятор пользователя.

Итак, подведем итог:

  • Время между началом прослушивания и получением позиции зависит от GPS устройства (изготовление, местоположение пользователя, спутниковый охват …)
  • В Android SDK есть способ прослушивания одного обновления.
  • Предоставляя объект критериев, вы можете управлять тем, какие критерии приемлемы для вас, чтобы получить местоположение. Более сильные критерии означают больше времени для получения точного ответа.
  // Get LocationManager object LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Create a criteria object to retrieve provider Criteria criteria = new Criteria(); // Get the name of the best provider String provider = locationManager.getBestProvider(criteria, true); // Get Current Location Location myLocation = locationManager.getLastKnownLocation(provider); //latitude of location double myLatitude = myLocation.getLatitude(); //longitude og location double myLongitude = myLocation.getLongitude(); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } 

AndroidManifest.xml:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.location.gps" /> 

MainActivity.java:

 public class MainActivity extends AppCompatActivity implements LocationListener { private LocationManager locationManager; private Location onlyOneLocation; private final int REQUEST_FINE_LOCATION = 1234; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION); } @Override public void onLocationChanged(Location location) { onlyOneLocation = location; locationManager.removeUpdates(this); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case REQUEST_FINE_LOCATION: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d("gps", "Location permission granted"); try { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates("gps", 0, 0, this); } catch (SecurityException ex) { Log.d("gps", "Location permission did not work!"); } } break; } }