2013-08-07 18 views
13

Questa è una domanda che è stata posta numerose volte ma non sono riuscito a trovare una soluzione che funzioni sempre.onLocationChanged non chiamato su alcuni dispositivi

Sto sviluppando un'applicazione utilizzando il provider di posizione Fused. Nel metodo onConnected(), sto richiedendo aggiornamenti di posizione e la logica dell'applicazione verrà avviata una volta generata una correzione di posizione e viene chiamato onLocationChanged(). (Si prega di fare riferimento al mio codice qui sotto).

ProblemaonLocationChanged() il metodo non viene mai chiamato su alcuni dispositivi. Io uso un Samsung Tab 2 e un Samsung Galaxy Grand per i test. Questo codice funziona perfettamente sulla scheda 2, ma non funziona su Grand. Non funziona, voglio dire che lo locationClient viene collegato ma non viene mai chiamato onLocationChanged().

In precedenza, ho utilizzato il responsabile della posizione per ottenere la posizione e in tale implementazione, si è verificato lo stesso problema. Quindi, ho provato a implementare il fornitore di posizione fuso, ma ho ancora lo stesso problema.

Qualcuno può aiutarmi con questo problema? C'è qualcosa che mi manca qui?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 

LocationClient locationclient; 
LocationRequest lr; 
Location loc1; 
static String address; 

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

    locationclient = new LocationClient(this,this,this); 
    locationclient.connect();   

} 

@Override 
public void onConnected(Bundle arg0) { 
    // TODO Auto-generated method stub 

    lr=LocationRequest.create(); 
    lr.setInterval(100); 
    locationclient.requestLocationUpdates(lr, this); 
    Log.d("LocationClient","On Connected"); 
} 

@Override 
public void onDisconnected() { 
    // TODO Auto-generated method stub 
    locationclient.disconnect(); 

} 

@Override 
public void onConnectionFailed(ConnectionResult arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onLocationChanged(Location loc) { 
    // TODO Auto-generated method stub  

    // Application Logic   

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude()); 
} 
} 
+0

Se onConnected() non verrà chiamato onConnectionFailed() dovrebbe essere attivato. Hai dato un'occhiata a ConnectionResult? –

+0

onConnected() viene chiamato e la connessione viene stabilita. L'ho verificato su entrambi i dispositivi. All'interno di onConnected() richiedo aggiornamenti di posizione che quindi non portano a chiamare onLocationChanged. – Rohit

+2

Hai trovato una soluzione o una soluzione alternativa? Sto affrontando lo stesso problema – gian1200

risposta

0

Vedi se stai ricevendo una posizione approvata dal test per se (loc == null). Anche se è lo stesso provider, forse un dispositivo sta tornando a zero e bombardando, dando come risultato che non sta sparando.

+0

Controllare che non ha aiutato. – Rohit

0

Questo forse non-senso, ma ho affrontato questo problema prima, qualcuno ha suggerito che si dovrebbe creare il proprio LocationListener invece di lasciare i vostri MainActivity attrezzi LocationListener. In sostanza questo:

locationclient.requestLocationUpdates(lr, your_location_listener); 

Spero che questo aiuti.

+0

Anche questo non ha aiutato. – Rohit

0

Ho risolto questo modificando entrambi i parametri, la distanza minima e tempo minimo tra gli aggiornamenti a 0. Secondo quanto ho testato su 2 dispositivi, ora onLocationChanged() viene chiamato regolarmente dopo la richiesta di aggiornamenti.

+0

Ho iniziato ad avere problemi anche con questo approccio. Su alcuni dispositivi, non riesco a ottenere una correzione della posizione. – Rohit

0

provare a rimuovere e reinstallare "google play services". Installarlo dal link di Google mercato muggito, google play services

-1

Qui Controlla questo codice fuori ...

public class MyActivity extends Activity implements LocationListener { 
double destLat, destLong; 

LocationManager locationManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    destLat = location.getLatitude(); 
    destLong = location.getLongitude(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 
+0

Questo esempio non sta utilizzando l'API Location Fused. –

2

ho osservato lo stesso comportamento su Galaxy Nexus e riconosciuto due cose che causano onLocationChanged() di non essere chiamato. Ci sono

  1. sorgente corrispondente posizione non è abilitata in Impostazioni di sistema. Per i satelliti GPS devono essere abilitati, per PRIORITY_BALANCED_POWER_ACCURACYWi-Fi deve essere abilitato.

  2. Anche per le origini di località abilitate non possono essere disponibili informazioni sulla posizione valide. Ad esempio, la sorgente PRIORITY_HIGH_ACCURACY è abilitata, ma non c'è (o non è buona) la ricezione GPS (ad esempio il dispositivo si trova all'interno di un edificio). Oppure la sorgente PRIORITY_BALANCED_POWER_ACCURACY è attivata, ma sia i dati Wi-Fi che quelli mobili sono disattivati.In quei casi la posizione non può essere rilevata e onLocationChanged() non verrà chiamato.

Per fissare 1 # ho dovuto verificare se le fonti di localizzazione richiesti sono attivati ​​anche prima di collegare ai Servizi Google API e se sono spenti, poi mi hanno notificato un utente gli ha chiesto/lei a consentire l'accesso alla posizione.

Per risolvere # 2 ho deciso di utilizzare LocationRequest.setExpirationDuration(). Ho impostato il timeout a circa 10 secondi e immediatamente dopo aver chiamato requestLocationUpdates() ho postato una richiamata ritardata di 10 secondi. Se la chiamata ritardata viene richiamata prima dello requestLocationUpdates(), significa che la posizione non può essere rilevata a causa del motivo n. 2. Faccio tre tentativi e poi mostro all'utente un messaggio di errore.

La documentazione di Android non è eccezionale in questo posto, ecco perché spero che questo aiuti.

+0

potresti spiegare un po 'di più per la tua soluzione n. 2? Non l'ho capito molto – roostaamir

+0

@roostaamir Ho aggiornato la risposta. –

1
lr.setInterval(100); 

con esso l'intervallo è 0,1 secondi, quindi è molto difficile per il chipset gps rilevare la posizione. L'intervallo dovrebbe essere> 1 secondo (con me è> 10)

locationRequest dovrebbe essere impostato:.

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) perché PRIORITY_BALANCED_POWER_ACCURACY in esterna non ottiene posizione. Il codice sarà:

lr=LocationRequest.create(); 

lr.setInterval(5 * 1000);// 5s 

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
locationclient.requestLocationUpdates(lr, this); 

Spero che questo aiuto.

Problemi correlati