2013-03-27 18 views
6

Jaki jest najlepszy sposób, aby uzyskać aktualną pozycję w Androida w następnym scenariuszuAndroid najlepszym sposobem, aby uzyskać aktualną lokalizację

  1. Jeśli GPS nie jest dostępny, dostać lokalizację z operatorem sieci

  2. Jeśli GPS jest dostępny i może uzyskać aktualną lokalizację, uzyskaj lokalizację od dostawcy GPS

  3. Jeśli GPS jest dostępny, ale nie można uzyskać bieżącej lokalizacji (tzn. Ciągle szuka lokalizacji), uzyskaj lokalizację od operatora sieci.

    teraz mogę uzyskać lokalizację z sieci, jeśli GPS jest niedostępny, najlepsza odpowiedź na powyższy scenariusz jest bardzo ceniona. z góry dziękuję.

+3

Sprawdź tę bibliotekę: https://code.google.com/p/little-fluffy-location-library/ – dannyroa

+0

Czy wymeldowałeś się na stary wpis 1. http://stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programowo-in-android 2. http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most- niezawodny sposób na uzyskanie-użytkowników-aktualna-lokalizacja-w-3145655 # 3145655 – surhidamatya

+0

Najprostszym sposobem jest użycie biblioteki wyższego poziomu, takiej jak ta: https://github.com/delight-im/Android - Prosta lokalizacja – caw

Odpowiedz

0
If GPS is available and can get current location, 

Na powyższe pytanie można spróbować tak ..

Stosując tę ​​można uzyskać szerokości i długości geograficznej dla bieżącej lokalizacji następnie przekazać wartość, aby uzyskać mapę.

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

członek klasy boolean mIsGpsFix;

Zapytanie Gps zmiana lokalizacji i ustawić minutnik

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

dobrze, można użyć Timer i TimerTask klas.

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

    } 
} 

klasa 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); 
    } 
} 

Tutaj timer zaplanowano na każde 500 milisekund. Oznacza, że ​​co 500 milisekund zostanie wykonane zadanie timera run method. W metodzie uruchamiania spróbuj uzyskać lokalizację od dostawcy GPS dla konkretnego numeru. prób (Tutaj MAX_ATTEMPTS) powiedz 5 lub 10. Jeśli otrzyma lokalizację w podanym nr. prób użyć tej lokalizacji, jeśli wartość licznika przekroczy (MAX_ATTEMPTS), następnie uzyskać lokalizację od dostawcy sieci. po uzyskaniu lokalizacji przekazałem tę lokalizację do metody wywołania zwrotnego onLocationReceived(Location mLoc), w której można wykonać dalszą pracę z danymi o lokalizacji. Oto w jaki sposób można wykorzystać metodę callback:

Listener

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

}

Twoja klasa powinna realizować powyżej zdefiniowanego słuchacza.W twojej klasie:

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

Mam nadzieję, że to pomoże. Jeśli ktokolwiek ma lepsze podejście, daj mi znać.

Powiązane problemy