2016-03-15 18 views
7

Appena ricevuto un Galaxy S7 (Edge) con Marshmallow (6.0.1) e rileva che ha un problema con la mia app che utilizza android.permission.ACCESS_COARSE_LOCATION e obiettivi Sdk Version 22 (Lollipop). Quando chiamo locationManager.getLastKnownLocation() restituisce sempre NULL. Ecco quello che sto correndo:LocationManager.getLastKnownLocation (LocationManager.NETWORK_PROVIDER) restituisce sempre NULL su Galaxy S7 (SOLO)

public Location getLastKnownLocationObject(Context context) { 

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

    try { 
     if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
      Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      // Location is always null on S7 (only) 
      Log.i(TAG, ">>> getLastKnownLocationObject() getLastKnownLocation: " + location); 
      return location; 
     } 

    } catch (Exception e) { 
     Log.e(TAG, ">>> getLastKnownLocationObject() exception", e); 
    } 
    return null; 

} 

Questo stesso codice funziona bene su ogni altro dispositivo che ho provato: Galaxy S5 (5.0.1), Nexus 7 (5.0.1), Nexus 9 (6.0.1), e Samsung Tab3 (4.4.2)

Si noti che se cambio il manifesto di utilizzare ACCESS_FINE_LOCATION, il codice precedente funziona bene su tutti i dispositivi. Sfortunatamente, la gestione non mi permetterà di cambiare i permessi in questo momento.

In alcune risposte che ho visto qui su SO, si consiglia di richiamare quanto segue prima di fare getLastKnownLocation(), ma ciò non ha avuto alcun effetto.

locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
          @Override 
          public void onStatusChanged(String provider, int status, Bundle extras) { 
          } 

          @Override 
          public void onProviderEnabled(String provider) { 
          } 

          @Override 
          public void onProviderDisabled(String provider) { 
          } 

          @Override 
          public void onLocationChanged(final Location location) { 
           // NEVER CALLED on Samsung S7 for LocationManager.NETWORK_PROVIDER 
          } 
         }); 

Quindi al momento, ritengo che questo sia un problema esclusivo del nuovo Samsung Galaxy S7.

+0

Hai provato a richiedere le autorizzazioni a livello di codice da quando Marshmallow ha introdotto il modello di autorizzazione Runtime? –

+0

Il mio target per le app è 22 (Lollipop). minSdkVersion 19 targetSdkVersion 22 – GaryAmundson

+0

È necessario richiedere specificamente le autorizzazioni per Android Marshmallow e versioni successive. Controlla questo post della mia - http://stackoverflow.com/questions/35856432/asking-for-permissions-while-using-locationmanager/35857017#35857017 –

risposta

2

Bene, si sta chiamando isProviderEnabled() così almeno che è coperto e utilizzando la posizione di rete deve essere abilitata. Tuttavia la formulazione esatta del documentation è:

"Se l'utente ha attivato questo fornitore nel menu Impostazioni, vero è restituito altrimenti false viene restituito"

quindi è solo circa il fornitore di essere "attivato" come non essere disattivato dall'utente.

Il telefono problematico (S7) hanno una carta di SIM all'interno? È possibile che su quel dispositivo specifico il posizionamento basato sulla rete richieda una carta SIM o una connessione Internet.

riferimento alla la documentation si potrebbe verificare ciò che questi ritorno:

locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresCell(); 
locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresNetwork(); 

E naturalmente solo chiamare getLastKnownLocation() sarà tornare null se la posizione è sconosciuta. Ed è sconosciuto se nessuna applicazione (la tua o un'altra) ha specificamente richiesto al dispositivo di determinare la sua posizione. Quindi il suggerimento di chiamare requestLocationUpdates() è il consiglio corretto. Ma potrebbe essere necessario un po 'di tempo per determinare la posizione, quindi chiamare getLastKnownLocation() subito dopo probabilmente restituisce null.

E anche se restituisce qualcosa, potrebbe essere dati molto vecchi che non è nemmeno più valida. Quindi, perché non solo subscribe to receive location updates? Questo è il modo in cui è inteso. Si sta utilizzando il posizionamento basato sulla rete in modo che non influenzi (in modo significativo) il consumo energetico e che gli aggiornamenti non vengano troppo spesso se si specificano i limiti di intervallo di tempo e distanza che si adattano alle proprie esigenze.

+0

Grazie per il vostro aiuto ... ora ci sono 2 diversi Galaxy S7 che sono stato in grado di testare, entrambi sono telefoni cellulari perfettamente funzionanti con accesso a Internet (e sono su due vettori diversi, non che ciò significhi qualcosa). Non ho problemi a ottenere le coordinate GPS con altre app. E tieni presente che se cambio le autorizzazioni su ACCESS_FINE_LOCATION non c'è alcun problema. Ho provato i .requiresCell() e .requiresNetwork() e, interessante, entrambi restituiscono True su S7, ma entrambe le chiamate restituiscono false su tutti gli altri dispositivi su cui eseguo il test. – GaryAmundson

+0

(e non è necessario iscriversi agli aggiornamenti perché ho solo bisogno di una posizione approssimativa per un'app meteo) – GaryAmundson

+0

Ovviamente è possibile chiamare 'removeUpdates()' una volta ricevuta la posizione aggiornata e aggiornata nel 'onLocationChanged()' callback e non riceverai ulteriori aggiornamenti. Questa sarebbe la soluzione per i casi in cui 'getLastKnownLocation()' restituisce null. –

2

Dalla mia esperienza con i dispositivi Samsung. Se riavvii il telefono e NON abiliti il ​​GPS, non otterrai una posizione. Se abiliti il ​​GPS come punto, magari eseguendo Google Maps, otterrai una posizione. Samsung non restituisce un percorso per i provider GPS, di rete o passivi a meno che non abbia ottenuto una posizione durante il ciclo di accensione dei dispositivi.

Nessuna delle chiamate che ho fatto nel codice mai farlo a calci in e attivare e ottenere una posizione.Funzionano bene su altri dispositivi. Samsung non sembra memorizzare queste informazioni per molto tempo.

Problemi correlati