2016-05-25 7 views
0

In dieser Klasse verbunden ,:GoogleApiClient Ausgabe: GoogleApiClient ist noch nicht

public class Presence implements ConnectionCallbacks, 
           OnConnectionFailedListener, LocationListener 

Ich habe die folgende Konstruktor:

private Presence(Context context) 
    { 
     this.context = context; 

     gApiClient = new GoogleApiClient.Builder(context, this, this) 
       .addApi(LocationServices.API) 
       .build(); 
     if (!gApiClient.isConnecting() && !gApiClient.isConnected()) 
     { 
      gApiClient.connect(); 
     } 
    } // of constructor() 

ich es verwenden, um eine Singleton Instanz zurückzugeben:

public static synchronized Presence getInstance(Context context) 
{ 
    if (presenceSingleton == null) 
     presenceSingleton = new Presence(context); 

    return presenceSingleton; 
} 

Die onConnected() sieht so aus:

@Override 
public void onConnected(Bundle connectionHint) 
{ 
    Log.e(LOG_TAG, "In onConnected(), gApiClient.isConnected(): " + 
      gApiClient.isConnected()); 
    createLocationRequest(); 
    getLocation(); 
    getSubLocality(); 
} // of onConnected() 

Basierend auf einer der Benutzereinstellungen in der App machen, kann ich die folgende Methode aufrufen, die App in einem sogenannten Auto-Pilot-Modus zu versetzen, wo es beginnt die Position des Benutzers Tracking:

public void startLocationUpdates() 
{ 
    // Prints 'false' in the logs: 
    Log.e(LOG_TAG, "In startLocationUpdates(), gApiClient.isConnected(): " + gApiClient.isConnected()); 
    Intent locationChangeIntent = new Intent(context, LocationTracker.class); 
    pendingIntent = PendingIntent.getService(context, 188, locationChangeIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    // Crash points to the following line: 
    LocationServices.FusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, pendingIntent); 
} // of startLocationUpdates() 

in der Haupttätigkeit, mache ich eine Instanz der Klasse oben in den onCreate():

public class MainClass extends AppCompatActivity implements 
           OnSharedPreferenceChangeListener 
{ 
    .... 
    .... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getAppSettings(); 
     presence = Presence.getInstance(getApplicationContext()); 
     .... 
     .... 
     startApp(); 
     .... 
    } 

    private void startApp() 
    { 
     if (pref_autoPilot) 
      presence.startLocationUpdates(); 
    } 

    .... 
    .... 
    .... 
} // of class MainClass 

Wenn der Benutzer den Autopiloten-Präferenz setzt die App stürzt mit folgenden Ausnahme:

java.lang.IllegalStateException: GoogleApiClient is not connected yet. 

an der in der obigen Methode angegebenen Linie startLocationUpdates().

Ich habe eine Menge Antworten gelesen, konnte aber keine Lösung für dieses Problem finden. Kannst du bitte darauf hinweisen, was ich falsch mache? Ist es, dass die Presence Klasse in einem AppCompatActivity oder FragmentActivity oder ähnlichem sein sollte, und kann nicht unabhängig sein wie hier? Bitte hilf mir, dieses nagende Problem zu beheben.

Vielen Dank im Voraus!

+0

Es gibt zwei Möglichkeiten, die Standortaktualisierungsmethode aufzurufen. 1. Wenn Sie nicht an Ort und Stelle sind, müssen Sie Standort-Updates aufrufen. 2. Wenn Sie gerade erhalten, dass Sie aktualisieren möchten, dann rufen Sie diese Methode in öffentlichen void onConnected (Bundle connectionHint) -Methode. –

+0

Danke @Kedi! Sie meinen, ich bewege die Zeile 'LocationServices.FusedLocationApi.requestLocationUpdates (gApiClient, locationRequest, pendingIntent);' von 'startLocationUpdates()' nach 'onConnected()'? Wäre das nicht immer im Autopilot-Modus? –

+1

sollten Sie presence.startLocationUpdates() aufrufen; Diese Methode von onConnected() -Methode. und überprüfe, ob dein Standort null ist und dann wird er anrufen. Versuchen Sie es einmal –

Antwort

0

Sie sollten presence.startLocationUpdates(); diese Methode von onConnected() Methode aufrufen. Überprüfen Sie den Zustand vor dem Anruf, wenn Ihr Standort null ist. Vor der Verbindung von GoogleApiClient können Sie den Standort nicht aktualisieren.

0

Befolgen Sie die einfachen Richtlinien unter Android Developers. Ich glaube, Sie das folgende Teil verpasst haben: Ihr

protected void onStart() { 
    mGoogleApiClient.connect(); 
    super.onStart(); 
} 

protected void onStop() { 
    mGoogleApiClient.disconnect(); 
    super.onStop(); 
} 

In MainActivity Sie brauchen connect und disconnect rufen, wenn erforderlich (in anderen Worten, wenn so Auto-Pilot-Modus genannt eingeschaltet ist)

+0

Danke @Rehan, aber die 'Presence' Klasse' erweitert '' nichts '. In der MainClass bekomme ich den Singleton und das sollte es tun, oder? Ich mache '' disconnect() 'in' MainClass' '' onStop() '... –

+0

@NarayanaJ Ich glaube nicht, Singleton-Klasse muss alles für sich selbst behandeln. Singleton-Muster stellen Sie nur die einzelne Instanz dieser Klasse sicher. Zweitens können Sie diesen Client nicht verwenden, wenn Sie ihn nicht richtig verbinden und trennen. – Rehan

+0

Vereinbart, @Rehan; Ich bin es manuell trennen von 'MainClass's' onDestroy() ' –

0

Sie sollten ein Clientobjekt in der onCreate (Bundle) -Methode Ihrer Activity instanziieren und dann connect() in onStart() und disconnect() in onStop() aufrufen, unabhängig vom Status.

+0

Danke @mdDroid, aber die' Presence' Klasse, 'erweitert' 'nichts'. In der MainClass bekomme ich den Singleton und das sollte es tun, oder? Ich mache die 'disconnect()' in 'MainClass''s' onStop() '... –

0

Aus Gründen der Vollständigkeit, @Kedi ...

Können Sie bitte darauf hinweisen, was ich falsch mache?

gApiClient.connect() wurde nicht an der richtigen Stelle aufgerufen. Bitte sehen Sie die akzeptierte Antwort.

Ist es, dass die Presence Klasse in einem AppCompatActivity oder FragmentActivity oder ähnlich sein sollte, und nicht wie hier unabhängig sein?

Es kann

Dank jeder für Ihre freundliche Hilfe einer unabhängigen Klasse sein.