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)
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top