Проблема GoogleApiClient: GoogleApiClient еще не подключен

В этом классе,:

public class Presence implements ConnectionCallbacks,
                                 OnConnectionFailedListener, LocationListener

У меня есть следующий конструктор:

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

Я использую его для возврата Singletonэкземпляра:

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

    return presenceSingleton;
}

onConnected()Выглядит так:

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

На основе настройки, которую пользователь может сделать в приложении, я вызываю следующий метод, чтобы поместить приложение в так называемый режим автопилота, где оно начинает отслеживать местоположение пользователя:

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

В основном действии я делаю экземпляр вышеуказанного класса в 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

Когда пользователь задает параметр auto pilot, приложение аварийно завершает работу со следующим исключением:

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

на линии, указанной в приведенном выше методе startLocationUpdates().

Я прочитал много ответов, но не смог найти решение этой проблемы. Можете ли вы указать, что я делаю неправильно? Является ли это, что Presenceкласс должен быть в AppCompatActivityИли FragmentActivityИли похож, и не может быть независимым, как здесь? Пожалуйста, помогите мне решить эту проблему.

Заранее большое спасибо!

4 ответа

  1. Следуйте простым рекомендациям разработчиков Android .
    Я думаю, что вы пропустили следующую часть:

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

    В свой MainActivityВам нужно звонить connectи disconnectпри необходимости (другими словами, когда так называемый режим автопилота включен)

  2. Необходимо создать экземпляр клиентского объекта в методе onCreate(Bundle) действия, а затем вызвать connect() в onStart() и disconnect() в onStop (), независимо от состояния.

  3. presence.startLocationUpdates();Этот метод следует вызывать из onConnected()метода. И проверьте условие для вызова, если ваше местоположение равно null. Перед подключением GoogleApiClient можно; t обновить местоположение.

  4. Для полноты, @Kedi…

    Можете ли вы указать, что я делаю неправильно?

    gApiClient.connect() не был вызван в нужном месте. Пожалуйста, ознакомьтесь с принятым ответом.

    Является ли это, что Presenceкласс должен быть в AppCompatActivityИли FragmentActivityИли похож, и не может быть независимым, как здесь?

    Это может быть независимый класс

    Спасибо всем за вашу любезную помощь.