在调用 onConnected 函数后,GoogleApiClient 抛出“ GoogleApiClient 尚未连接”

因此,我发现了一些关于 GoogleApiClient 的东西,对我来说并不是很清楚。 GoogleApiClient 有一个名为 连接的函数,该函数在客户端为 有联系时运行(当然)。

我得到了我自己的函数: 收听,它最终是 在 GoogleApiClient 的 onConnected 上接听电话函数。

我的 StartLocationListingfunction 在没有 GoogleApiClient 连接的情况下无法运行。

代码和日志:

@Override
public void onConnected(Bundle bundle) {
log("Google_Api_Client:connected.");
initLocationRequest();
startLocationListening(); //Exception caught inside this function
}

...

private void startLocationListening() {
log("Starting_location_listening:now");


//Exception caught here below:
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}

唯一的例外是:

03-30 12:23:28.947: E/AndroidRuntime(4936):     java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

我的调试日志还显示 连接函数被调用:

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

在这之后,我得到了例外。

我错过了什么吗?我得到了一个“连接”的响应,我运行了我的函数,我得到了一个错误“未连接”这是什么?另外一个恼人的事情是: 我使用这个位置服务几个星期了,从来没有得到这个错误。

译者:

我添加了一个更具体的日志输出,让我大吃一惊,看看这个:

@Override
public void onConnected(Bundle bundle) {


if(mGoogleApiClient.isConnected()){
log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
}
else{
log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
}


initLocationRequest();
startLocationListening();
}

在这种情况下,log 输出:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

是的,我刚刚得到 mGoogleApiClient.isConnected() == false里面的 onConnected()怎么可能呢?

译者:

由于没有人可以回答这个问题,即使有声望的赏金,我决定把这个 bug 报告给谷歌。接下来发生的事情真的让我感到惊讶。 谷歌对我的报告的官方回答是:

“这个网站是针对 AOSP Android 源代码的开发者问题的 代码和开发人员工具集,而不是谷歌应用程序或服务,如 播放服务,GMS 或 Google API。不幸的是,似乎没有 是一个合适的地方报告错误与播放服务。我所能 说这个网站是不是,对不起。试试在谷歌上发布 而是产品论坛。”

完整版 请在此报到。(我希望他们不会仅仅因为它很傻就删除它)

所以,是的,我看了谷歌产品论坛,只是找不到任何主题发布这个东西,所以此刻我感到困惑和卡住了。

地球上有人能帮我吗?

译者:

面糊中的完整代码

49200 次浏览

我刚刚注意到您正在 onStartCommand ()中创建 googleApiClient。

假设您的服务被触发两次。将创建两个 googleApiClient 对象,但您只能引用其中一个。如果没有引用的客户端执行对 onConnected ()的回调,那么您将在该客户端中连接,但是实际上有引用的客户端仍然可能断开连接。

我怀疑就是这么回事。尝试将 googleApiClient 创建移动到 onCreate,看看是否得到相同的行为。

我也犯了同样的错误,但是我的问题和 iheanyl 的答案不同:

我已经声明了 googleApiClient 是静态的,这阻止了 android 关闭服务。

将 googleApi 创建移动到 onCreate 为我解决了这个问题。

我有这个问题时,我偶然但 googleApiClient.connect ()在创建和简历。只是删除了它从创建。

Https://developer.android.com/reference/com/google/android/gms/common/api/googleapiclient.html

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

GoogleApiClient 的实现似乎只为单个实例设计。最好在 onCreate 中只实例化它一次,然后使用单个实例执行连接和断开连接。

OnStart ()方法中的 call connect ()方法

 @Override
protected void onStart() {
super.onStart();


// Call GoogleApiClient connection when starting the Activity
googleApiClient.connect();
}


@Override
protected void onStop() {
super.onStop();


// Disconnect GoogleApiClient when stopping Activity
googleApiClient.disconnect();
}

我认为我找到了问题的根源,而这与 API 没有任何关系。我每次安装这个应用程序时都会遇到这个问题。顺便说一下,就像最流行的评论,我只有一个 googleApiClient 暂停和恢复。我注意到,获得地理定位权限的许可请求会弹出。正如你所知道的,在你的活动中,这将变成一个暂停,一旦弹出窗口消失,它将恢复你的活动。很可能您的 googleClient 也被链接到这些事件以断开连接。一旦接受权限并准备执行 googleApiClient 任务,就可以看出没有连接。

 if(googleApiClient.isConnected()){


rxPermissions
.request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribe(granted -> {


if (granted) {
//here it could be client is already disconnected!!
_geolocateAddress(response);
} else {
// Oups permission denied
}
});
}

您可以在设置标志时跳过断开和连接,该标志在权限之前为 true,在完成 googleApiClient 任务或 granted为 false 之后为 true。

if(googleApiClient.isConnected()){
isRequestingPermission = true;
rxPermissions
.request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribe(granted -> {
if (granted && googleApiClient.isConnected()) {
//Once the task succeeds or fails set flag to false
//at _geolocateAddress
_geolocateAddress(response);
} else {
// Oups permission denied
isRequestingPermission = false;
}
});
}

我们还可以单独分割执行权限,如果被授予,则进行任务调用。好吧,我承认我使用了一个片段,我重新安装了应用程序,甚至旋转了许可的屏幕,一旦授权,结果显示出来。我希望这能帮到其他人。

  • 你不必卸载应用程序。只需设置/应用程序管理器/应用程序/权限并关闭任何设置,然后再次测试应用程序。

我遇到了这个问题,并通过将 googleApiClient 声明为静态对象解决了这个问题

将 GoogleApiClient 从 onStartCommand 移动到 onCeate 解决了我的问题