Intereting Posts
Есть ли простой способ превратить массив байтов из камеры onPreviewFrame в изображение в андроиде? Отладочный ключ Android? Styles.xml inherit "? Android: attr / borderlessButtonStyle"? Есть ли способ загрузить и частично отрисовать растровое изображение из файла на Android? Подключение MySql с Android без использования PHP Сканирование отпечатков пальцев Android с помощью устройства Samsung Добавить действие к уведомлению о пожарной базе Apk отклоняется от Samsung Apps Android SDK – с помощью Gesture API, хотелось бы, чтобы жест оставался на экране после того, как был признан Самый простой способ воспроизведения аудио RTMP-потока в Android Android. Избегайте масштабирования фона Как искать контакты с адресом (FORMATTED_ADDRESS) с одним запросом? Finish () не закрывает активность при вызове после первого запуска Как определить, какой внутренний анонимный класс указан именем класса? Как использовать Android Spinner как раскрывающийся список

Android лучший способ получить текущее местоположение

Каков наилучший способ получить текущее местоположение в android для следующего сценария,

  1. Если GPS недоступен, найдите местоположение от поставщика сети

  2. Если GPS доступен и может получить текущее местоположение, найдите местоположение у поставщика GPS

  3. Если GPS доступен, но не может получить текущее местоположение (т. Е. Постоянное местоположение поиска), получить местоположение от поставщика сети.

    Теперь я могу получить местоположение из сети, если gps недоступно, наилучший ответ для удовлетворения вышеуказанного сценария высоко оценен. заранее спасибо.

Ну, вы можете использовать классы Timer и TimerTask .

LocationManager manager; TimerTask mTimertask; GPSLocationListener mGPSLocationListener; int i = 0; //Here i works as counter; private static final int MAX_ATTEMPTS = 250; public void getCurrentLocation() { manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mGPSLocationListener = new GPSLocationListener(); manager.addGpsStatusListener(mGPSStatusListener); mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER); if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Log.v(TAG, "GPS ENABLED"); manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } else { turnGPSOn(); manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 50.0f, mNetworkLocationListener); } if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { Log.v(TAG, "GPS ENABLED"); manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } myLocTimer = new Timer("LocationRunner", true); myLocTimer.schedule(mTimerTask, 0, 500); } 

GPSStatusListener

 private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() { @Override public synchronized void onGpsStatusChanged(int event) { switch (event) { case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Log.v(TAG, "GPS SAtellitestatus"); GpsStatus status = manager.getGpsStatus(null); mSattelites = 0; Iterable<GpsSatellite> list = status.getSatellites(); for (GpsSatellite satellite : list) { if (satellite.usedInFix()) { mSattelites++; } } break; case GpsStatus.GPS_EVENT_FIRST_FIX: /* * Toast.makeText(getApplicationContext(), "Got First Fix", * Toast.LENGTH_LONG).show(); */ break; case GpsStatus.GPS_EVENT_STARTED: /* * Toast.makeText(getApplicationContext(), "GPS Event Started", * Toast.LENGTH_LONG).show(); */ break; case GpsStatus.GPS_EVENT_STOPPED: /* * Toast.makeText(getApplicationContext(), "GPS Event Stopped", * Toast.LENGTH_LONG).show(); */ break; default: break; } } }; 

LocationListener

 public class GPSLocationListener implements LocationListener { @Override public void onLocationChanged(Location argLocation) { location = argLocation; } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } 

Класс TimerTask

 class LocTimerTask extends TimerTask { String provider; public LocTimerTask(String provider) { this.provider = provider; } final Handler mHandler = new Handler(Looper.getMainLooper()); Runnable r = new Runnable() { @Override public void run() { i++; Log.v(TAG, "Timer Task run" + i); location = manager.getLastKnownLocation(provider); if (location != null) { Log.v(TAG, "in timer task run in if location not null"); isGPS = true; onLocationReceived(location); myLocTimer.cancel(); myLocTimer.purge(); mTimerTask.cancel(); return; } else { Log.v(TAG, "in timer task run in else location null"); isGPS = false; if (location == null && i == MAX_ATTEMPTS) { Log.v(TAG, "if 1 max attempts done"); turnGPSOff(); location = manager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { Log.v(TAG, "if 1 max attempts done Location from network not null"); Log.v(TAG, "if 1 max attempts done Location from network not null coordinates not null"); onLocationReceived(location); myLocTimer.cancel(); myLocTimer.purge(); mTimerTask.cancel(); return; } } else { return; } } i = 0; } }; public void run() { mHandler.post(r); } } 

Здесь таймер должен запускаться каждые 500 миллисекунд. Значит, каждые 500 миллисекунд будет run method таймера. В режиме прогона попытайтесь найти местоположение у поставщика GPS для конкретного нет. Попыток ( здесь MAX_ATTEMPTS ) говорят 5 или 10. Если он получает место в указанном нет. Попыток затем использовать это местоположение, если значение счетчика ( здесь i ) превысило MAX_ATTEMPTS, а затем получить местоположение от поставщика сети. При получении местоположения я передал это место методу обратного вызова onLocationReceived(Location mLoc) в котором вы можете продолжить свою работу с данными о местоположении. Вот как вы будете использовать метод обратного вызова:

слушатель

 public interface OnLocationReceivedListener { public void onLocationReceived(Location mLoc); //callback method which will be defined in your class. 

}

Ваш класс должен реализовать вышеприведенный слушатель. В вашем классе:

 @Override public void onLocationReceived(Location mLoc) { //Do your stuff } 

Надеюсь, поможет. Если у кого-то есть лучший подход, пожалуйста, дайте мне знать.

 If GPS is available and can get current location, 

Для вышеуказанного вопроса вы можете попробовать вот так.

Используя это, вы можете получить широту и долготу для текущего местоположения, а затем передать значение, чтобы получить карту.

 public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { loc.getLatitude(); loc.getLongitude(); String Text = “My current location is: “ + “Latitud = “ + loc.getLatitude() + “Longitud = “ + loc.getLongitude(); Toast.makeText( getApplicationContext(), Text, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText( getApplicationContext(), “Gps Disabled”, Toast.LENGTH_SHORT ).show(); } @Override public void onProviderEnabled(String provider) { Toast.makeText( getApplicationContext(), “Gps Enabled”, Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } } } 

Член класса boolean mIsGpsFix ;

Запросить обновление местоположения Gps и настроить таймер обратного отсчета

 mCountDown.start(); private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { // No fix after the desire amount of time collapse if (!mIsGpsFix) // Register for Network } };