2011-11-08 13 views
5

En mi aplicación, quiero usar ambos proveedores de ubicación.¿Cómo cambio de GPS a proveedor de red?

Eso significa que, si el gps está desactivado, quiero que mi aplicación cambie a la red y cuando gps esté habilitado para volver a activarla.

Estoy usando dos LocationListener para manejar esas dos solicitudes.

public void onStatusChanged(String provider, int status,Bundle extras) 
    switch (status) { 
     case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      ...... 
      break; 
     case LocationProvider.OUT_OF_SERVICE 
      ..... 
      break; 
     case LocationProvider.AVAILABLE 
      ..... 
      break; 
} 

Y en el cada oyente, detectar aquellas estado en el onStatusChanged(). Resulta que este método se usará en el primer cambio (red deshabilitada), pero cuando habilito la red nuevamente, no muestra nada. ¿Por qué fue eso? ¿El oyente no detectará el estado todo el tiempo?

Por favor, ayúdenme, sería mejor publicar su solución en código ... ¡Gracias!

+0

vistazo a mi nueva comentar. – user370305

+0

Chicos, la nueva solución es una combinación de user370305 y el trabajo de Fedor. Fedor hizo un gran trabajo al inicializar y elegir el proveedor de ubicación correcto. Y con la ayuda de user370305. Podemos iniciar un hilo para detectar el estado de la red/gps. Porque, si haces un 'removeUpdates()', el oyente ya no funcionará. Por lo tanto, el 'caso LocationProvider.AVAILABLE' es inútil. Solo puedes usar el hilo para hacer una nueva solicitud. (Sé que no es muy buena, así que si tienes una mejor solución, por favor avísame, ¡me encantará ver eso! ¡Gracias!) – alvan

Respuesta

2

Tu respuesta está aquí What is the simplest and most robust way to get the user's current location in Android?. En este Fedor muy bien explicado con un ejemplo de cómo cambiar entre proveedor de ubicación.

Gracias.

+0

I piense que el trabajo de Fedor acaba de identificar qué proveedor podría usarse en la fase de inicialización. ¿Estás diciendo que debería actualizar un hilo para detectar 'isProviderEnabled'? – alvan

+0

ok, [¿Cómo cambiar de proveedor a proveedor GPS si el teléfono Android no tiene conexión a Internet?] (Http://stackoverflow.com/questions/7776049/how-to-switch-provider-into-gps-provider-if- android-phone-doesnt-have-internet/7776108 # 7776108) en este vistazo a mi respuesta. y avíseme si es útil para usted o no. – user370305

+0

Gracias, su código da la sugerencia de que debería iniciar un hilo para verificar CONNECTIVITY_SERVICE. – alvan

4

Esto es lo que hago:

public class LocationActivity extends Activity implements LocationListener{ 

    private TextView latituteField; 
    private TextView longitudeField; 
    private LocationManager locationManager; 
    private String provider; 
    private TextView outputField; 
    private Location location; 
    private ScrollView scrollView; 
    private Criteria criteria; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_location); 

     latituteField = (TextView) findViewById(R.id.lat_textView); 
     longitudeField = (TextView) findViewById(R.id.long_textView); 
     outputField = (TextView) findViewById(R.id.output_textView); 
     scrollView = (ScrollView) findViewById(R.id.scrollView1); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 

     List<String> providers = locationManager.getProviders(criteria, true); 
     outputField.append("Providers available..." + "\n"); 
     for (String provider : providers) { 
      outputField.append(provider + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 

     provider = locationManager.getBestProvider(criteria, true); 
     locationManager.requestLocationUpdates(provider, 400, 1, this); 

     if (provider != null) { 
      outputField.append("Provider " + provider + " has been selected." + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 

      if (location != null) { 
       onLocationChanged(location); 
      } else { 
       latituteField.setText("Location not available"); 
       longitudeField.setText("Location not available"); 
      } 
      } else { 
      outputField.append("No provider selected" + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
      } 
    } 

    @Override 
     protected void onResume() { 
     super.onResume(); 
     locationManager.requestLocationUpdates(provider, 400, 1, this); 
     } 

    protected void onPause() { 
     super.onPause(); 
     locationManager.removeUpdates(this); 
     } 

    @Override 
    public void onLocationChanged(Location location) { 
     double lat =location.getLatitude(); 
     double lng =location.getLongitude(); 
     latituteField.setText(String.valueOf(lat)); 
     longitudeField.setText(String.valueOf(lng)); 
     outputField.append("New Location: " + String.valueOf(lat) + " " + String.valueOf(lng) + "\n"); 
     scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
    } 

    @Override 
    public void onProviderDisabled(String dProvider) { 
     outputField.append("Provider " + dProvider + " has been disabled." + "\n"); 
     scrollView.fullScroll(ScrollView.FOCUS_DOWN); 

     provider = locationManager.getBestProvider(criteria, true); 
     locationManager.requestLocationUpdates(provider, 400, 1, this); 

     if (provider != null) { 
      outputField.append("Provider " + provider + " has been selected." + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 

      if (location != null) { 
       onLocationChanged(location); 
      } else { 
       latituteField.setText("Location not available"); 
       longitudeField.setText("Location not available"); 
      } 
      } else { 
      outputField.append("No provider selected" + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
      } 
    } 

    @Override 
    public void onProviderEnabled(String eProvider) { 
     outputField.append("Provider " + eProvider + " has been enabled." + "\n"); 
     scrollView.fullScroll(ScrollView.FOCUS_DOWN); 

     provider = locationManager.getBestProvider(criteria, true); 
     locationManager.requestLocationUpdates(provider, 400, 1, this); 

     if (provider != null) { 
      outputField.append("Provider " + provider + " has been selected." + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 

      if (location != null) { 
       onLocationChanged(location); 
      } else { 
       latituteField.setText("Location not available"); 
       longitudeField.setText("Location not available"); 
      } 
      } else { 
      outputField.append("No provider selected" + "\n"); 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
      } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     outputField.append("Provider " + provider + " status changed to: " + Integer.toString(status) + "\n"); 
     scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
} 
Cuestiones relacionadas