2016-05-25 5 views
0

не подключен В этом классе ,: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 

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

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

по указанной выше схеме startLocationUpdates().

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

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

+0

Существует два способа вызова метода обновления местоположения. 1. Если вы не получаете locatoin, тогда вам нужно вызвать обновления местоположения. 2. Если вы получаете даже вы хотите обновить, тогда вызовите этот метод в общедоступном void onConnected (Bundle connectionHint). –

+0

Спасибо @ Kedi! Вы имеете в виду, что я перемещаю строку 'LocationServices.FusedLocationApi.requestLocationUpdates (gApiClient, locationRequest, pendingIntent);' from' startLocationUpdates() 'to' onConnected() '? Не может ли это сделать приложение в режиме автопилота? –

+1

вы должны вызвать presence.startLocationUpdates(); этот метод из метода onConnected(). и проверьте, является ли ваше местоположение нулевым, а затем оно вызовет. Попробуйте один раз –

ответ

0

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

0

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

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

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

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

+0

Спасибо @Rehan, но класс 'Presence'' extends' 'ничего'. В «MainClass» я получаю свой Синглтон, и он должен это делать, правильно? Я делаю 'disconnect()' в 'onStop()' MainClass '...' –

+0

@NarayanaJ Я не думаю, что класс Singleton должен обрабатывать все для себя. Шаблон Singleton просто убедитесь, что один экземпляр этого класса. Во-вторых, вы не сможете использовать этот клиент, как это, если вы не подключаетесь и не отсоединяете его правильно! – Rehan

+0

Согласен, @Rehan; Я отключаю его вручную из 'onDestroy()' MainClass' ( –

0

Вы должны создать экземпляр объекта клиента в методе onCreate (Bundle) Activity Activity, а затем вызвать connect() в onStart() и отключить() в onStop() независимо от состояния.

+0

) Благодаря @mdDroid, но класс 'Presence',' extends' 'nothing'. В «MainClass» я получаю свой Синглтон, и он должен это делать, правильно? Я делаю 'disconnect()' в 'onStop()' MainClass'' ... –

0

Для полноты картины, @Kedi ...

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

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

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

Она может быть самостоятельным классом

Спасибо каждый за любезную помощь.