GoogleApiClient问题:GoogleApiClient尚未连接

时间:2016-05-25 12:29:38

标签: java android google-api-client

在本课程中,:

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或类似,并且不能像这里一样独立?请帮我解决这个棘手的问题。

非常感谢提前!

4 个答案:

答案 0 :(得分:0)

遵循Android Developers的简单指南。 我想你错过了以下部分:

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

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

在您的MainActivity中,您需要在需要时拨打connectdisconnect(换句话说,当所谓的自动驾驶模式开启时)< / p>

答案 1 :(得分:0)

  

您应该在Activity的onCreate(Bundle)方法中实例化一个客户端对象,然后在onStart()中调用connect(),在onStop()中调用disconnect(),无论状态如何。

答案 2 :(得分:0)

您应该从presence.startLocationUpdates();方法调用onConnected()此方法。如果您的位置为空,请检查调用条件。在GoogleApiClient连接发生之前,您可以更新位置。

答案 3 :(得分:0)

为了完整起见,@ Kedi ......

  

请指出我做错了什么?

gApiClient.connect()没有在正确的地方被召唤。请参阅接受的答案。

  

Presence课程应该是AppCompatActivity还是FragmentActivity或类似,并且不能像这里一样独立?

可以是一个独立的班级

感谢每一位朋友的帮助。