LocationClient non connesso nel metodo "onConnected"
-
21-12-2019 - |
Domanda
ha già avuto questo problema: - Inizializza un locationclient, con connectionCallbacks e così via ... - Quindi, chiamo "Connect ()" su di esso. - Nel mio metodo "onCollected", chiamo myLocationClient.getLastLocation (), che rende l'app ACC su alcuni dispositivi di persone, con eccezione:
."Eccezione fatale: Java.Lang.LilleGalStateException non connesso. Chiamata Connetti () e attendere in onconnected () da chiamare. "
Qualche idea?
Ecco parte del codice:
myLocationClient = new LocationClient(this, new ConnectionCallbacks() {
@Override
public void onDisconnected() {
//Do some stuff here
}
@Override
public void onConnected(Bundle arg0) {
if(myLocationClient.getLastLocation() != null) {
//Do some other stuff here
}
}
}, new OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult arg0) {
//Do other stuff here
}
});
myLocationClient.connect();
.
L'app si schianta sulla prima riga del metodo "onCollected".
Per le persone che vogliono lo stack qui è:
java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
at com.google.android.gms.internal.k.B()
at com.google.android.gms.internal.bh.a()
at com.google.android.gms.internal.bh$c.B()
at com.google.android.gms.internal.bg.getLastLocation()
at com.google.android.gms.internal.bh.getLastLocation()
at com.google.android.gms.location.LocationClient.getLastLocation()
at com.myAppPackage.onConnected(AroundMeActivity.java:321)
at com.google.android.gms.internal.k.y()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$b.D()
at com.google.android.gms.internal.k$a.handleMessage()
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(NativeStart.java)
. Soluzione
Il locationClient.getLastLocation()
ottiene l'ultima posizione nota dal client. Tuttavia, il fornitore di posizione fuso manterrà solo la posizione di base se almeno un client è collegato ad esso. Una volta che il primo client si connette, cercherà immediatamente di ottenere una posizione. Se la tua attività è il primo client per connettersi e chiami getLastLocation()
subito in onConnected()
, che potrebbe non essere abbastanza tempo per la prima posizione di entrare. Questo comporterà la posizione di essere null.
Per risolvere questo problema, devi aspettare (indeterminato) fino a quando il provider prende la posizione e quindi chiamare getLastLocation()
, che è impossibile da sapere.
Un'altra opzione (migliore) è implementare l'interfaccia com.google.android.gms.location.LocationListener
per ricevere aggiornamenti di posizione periodica (e spegnerlo dopo aver ottenuto il primo aggiornamento).
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
// . . . . . . . . more stuff here
LocationRequest locationRequest;
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . . . other initialization code
locationClient = new LocationClient(this, this, this);
locationRequest = new LocationRequest();
// Use high accuracy
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
locationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation();
if (location == null)
locationClient.requestLocationUpdates(locationRequest, this);
else
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
locationClient.removeLocationUpdates(this);
// Use the location here!!!
}
.
In questo codice, stai controllando se il client ha già l'ultima posizione (in onColled). In caso contrario, stai richiedendo aggiornamenti della posizione e spegnendo le richieste (in onLocationChanged()
Callback) non appena ottieni un aggiornamento .
Aggiornamento:
Molte volte, l'utente avrebbe servizi di localizzazione disabilitati (per salvare la batteria o i motivi della privacy). In tal caso, il codice sopra riportato comunque gli aggiornamenti della posizione, ma onLocationChanged
non verrà mai chiamato. È possibile interrompere le richieste controllando se l'utente ha disabilitato i servizi di localizzazione.
Se la tua app richiede loro di abilitare i servizi di localizzazione, vorresti mostrare un messaggio o un brindisi. Sfortunatamente, non c'è modo di controllare se l'utente ha disabilitato i servizi di localizzazione nell'aPI di servizi di localizzazione di Google. Per questo, dovrai ricorrere all'aPI di Android.
Nel tuo metodo ONCREAT:
LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationEnabled = false;
Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;
.
E utilizzare il flag Loseenabled nel tuo metodo onConnected come questo:
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
.
Speciale grazie a Rahul Jiresal.