2013-03-27 5 views
6

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

  1. Если GPS не доступен, получить расположение от провайдера сетей

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

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

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

+3

Посмотрите эту библиотеку: https://code.google.com/p/little-fluffy-location-library/ – dannyroa

+0

Вы отправились на старое сообщение 1. http://stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programatically-in-android 2. http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most- # 3145655 – surhidamatya

+0

Простейший способ использования библиотеки более высокого уровня, такой как: https://github.com/delight-im/Android -SimpleLocation – caw

ответ

0
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) 

{ 

} 

} 

} 
0

класс участник 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 
    } 
}; 
2

Ну, вы можете использовать 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 
} 

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