2014-06-05 15 views
6

Sto lavorando a un'app che utilizza i servizi di riproduzione di Google. Su alcuni telefoni, il client restituisce null per posizione. Ciò accade perché l'opzione locaiton non è abilitata nelle impostazioni di google come nella foto allegata.Android: Verifica se la posizione delle impostazioni di google è abilitata

Come verificare in modo programmatico se la posizione delle impostazioni di Google è abilitata in un'app Android?

http://www.cnet.com/how-to/explaining-the-google-settings-icon-on-your-android-device/

+0

uso 'LocationManager' per controllare i diversi fornitori di – tyczj

risposta

4
LocationManager lm = null; 
boolean gps_enabled,network_enabled; 
    if(lm==null) 
     lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    try{ 
    gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    }catch(Exception ex){} 
    try{ 
    network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    }catch(Exception ex){} 

    if(!gps_enabled && !network_enabled){ 
     dialog = new AlertDialog.Builder(context); 
     dialog.setMessage(context.getResources().getString(R.string.gps_network_not_enabled)); 
     dialog.setPositiveButton(context.getResources().getString(R.string.open_location_settings), new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface paramDialogInterface, int paramInt) { 
       // TODO Auto-generated method stub 
       Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       context.startActivity(myIntent); 
       //get gps 
      } 
     }); 
     dialog.setNegativeButton(context.getString(R.string.Cancel), new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface paramDialogInterface, int paramInt) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     dialog.show(); 

    } 

ACTION_LOCATION_SOURCE_SETTINGS mostra l'utente, impostazioni per consentire la configurazione delle fonti di localizzazione corrente.

+3

Perché prima impostare il valore di' lm' a 'null', quindi verificare se è uguale a 'null', e se lo è, impostane il valore sul servizio di localizzazione del sistema, quando puoi semplicemente dichiararlo su una riga, in questo modo:' LocationManager lm = (LocationManager) context.getSystemService (Context.LOCATION_SERVICE); ' –

9

E 'possibile verificare se i servizi di Google Play sono disponibili. Segui le istruzioni qui: https://developer.android.com/training/location/retrieve-current.html

E 'possibile getLastLocation() restituirà null anche se i servizi di localizzazione di Google Play Services sono abilitati. Ad esempio, subito dopo averli riabilitati. Tuttavia si può quindi prendere il vostro utente ai servizi di Google Play località Impostazioni utilizzando il seguente intento:

Intent settings = new Intent("com.google.android.gms.location.settings.GOOGLE_LOCATION_SETTINGS"); 
startActivity(settings); 

Infine, è anche possibile controllare se Android servizi di localizzazione sono abilitati:

public static boolean isLocationEnabled(Context context) { 
    int locationMode = 0; 
    String locationProviders; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ 
     try { 
      locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE); 

     } catch (SettingNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return locationMode != Settings.Secure.LOCATION_MODE_OFF; 

    }else{ 
     locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
     return !TextUtils.isEmpty(locationProviders); 
    } 


} 
+0

Ciao! Questa soluzione è davvero buona. Solo una cosa, Settings.Secure.LOCATION_PROVIDERS_ALLOWED è stata ritirata al livello API 17 e Kitkat ha il livello API 19. Manca il livello API 18 nel tuo blocco if else. Ho ragione? –

+0

Ci scusiamo per la risposta ritardata. Non sono sicuro, ma l'ho scritto nel 2014, quindi le cose sono decisamente cambiate da allora. – gflarity

0

Ci dovrebbe essere un cambiamento, dove si controlla TextUtils.isEmpty(locationProviders). Non è mai vuoto Dove non esiste un provider (le impostazioni della posizione sono disabilitate) ha il valore "null". Sì, intendo il valore "null", non null.

1

Ho pensato che questa fosse la soluzione migliore.

È possibile verificare dal seguente codice:

/** 
    * This is used to check whether location is enabled or not. 
    * @param mContext 
    * @return 
    */ 
    public static boolean isDeviceLocationEnabled(Context mContext) { 
     int locMode = 0; 
     String locProviders; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ 
      try { 
       locMode = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE); 
      } catch (Settings.SettingNotFoundException e) { 
       e.printStackTrace(); 
       return false; 
      } 
      return locMode != Settings.Secure.LOCATION_MODE_OFF; 
     }else{ 
      locProviders = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
      return !TextUtils.isEmpty(locProviders); 
     } 
    }