2010-08-12 10 views

risposta

19

Se si desidera acquisire la posizione su un pulsante, ecco come si farebbe. Se l'utente non ha un servizio di localizzazione abilitato, questo li invierà al menu delle impostazioni per attivarlo.

Innanzitutto, è necessario aggiungere l'autorizzazione "android.permission.ACCESS_COARSE_LOCATION" al manifest. Se avete bisogno di GPS (percorso di rete non è abbastanza sensibile), aggiungere l'autorizzazione "android.permission.ACCESS_FINE_LOCATION", invece, e cambiare il "Criteria.ACCURACY_COARSE" a "Criteria.ACCURACY_FINE"

Button gpsButton = (Button)this.findViewById(R.id.buttonGPSLocation); 
gpsButton.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // Start loction service 
     LocationManager locationManager = (LocationManager)[OUTERCLASS].this.getSystemService(Context.LOCATION_SERVICE); 

     Criteria locationCritera = new Criteria(); 
     locationCritera.setAccuracy(Criteria.ACCURACY_COARSE); 
     locationCritera.setAltitudeRequired(false); 
     locationCritera.setBearingRequired(false); 
     locationCritera.setCostAllowed(true); 
     locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT); 

     String providerName = locationManager.getBestProvider(locationCritera, true); 

     if (providerName != null && locationManager.isProviderEnabled(providerName)) { 
      // Provider is enabled 
      locationManager.requestLocationUpdates(providerName, 20000, 100, [OUTERCLASS].this.locationListener); 
     } else { 
      // Provider not enabled, prompt user to enable it 
      Toast.makeText([OUTERCLASS].this, R.string.please_turn_on_gps, Toast.LENGTH_LONG).show(); 
      Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      [OUTERCLASS].this.startActivity(myIntent); 
     } 
    } 
}); 

mia classe esterna ha questo listener impostato

private final LocationListener locationListener = new LocationListener() { 

    @Override 
    public void onLocationChanged(Location location) { 
     [OUTERCLASS].this.gpsLocationReceived(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 

}; 

Quindi, quando si desidera interrompere l'ascolto chiamare questo. Dovresti almeno effettuare questa chiamata durante il metodo onStop della tua attività.

LocationManager locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); 
locationManager.removeUpdates(this.locationListener); 
+2

Il secondo parametro su getBestProvider (locationCritera, true) controlli che i fornitori sono abilitato, quindi, in teoria, non è necessario controllare se è abilitato di nuovo. – Eduardo

0

per richiedere all'utente per consentire servizi di localizzazione si dovrebbe usare il nuovo LocationRequest incluso nel Google Play Services, è possibile trovare la guida completa in LocationRequest

2

Dopo aver attraversato un sacco di risposte su Stack Overflow, Ho trovato questo metodo per funzionare perfettamente e non richiede nemmeno un sacco di codice.
Dichiarare int GPSoff = 0 come variabile globale.
Ora, ovunque è necessario controllare per lo stato attuale del GPS e ri-diretta all'utente di accendere il GPS acceso, utilizzare questo:

try { 
       GPSoff = Settings.Secure.getInt(getContentResolver(),Settings.Secure.LOCATION_MODE); 
      } catch (Settings.SettingNotFoundException e) { 
       e.printStackTrace(); 
      } 
      if (GPSoff == 0) { 
       showMessageOKCancel("You need to turn Location On", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           Intent onGPS = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
           startActivity(onGPS); 
          } 
         }); 
      } 
+0

Che cos'è getContentResolver(), showMessageOKCancel e startActivity? Sono tutti irrisolti – hfz

Problemi correlati